Java创建对象的几种方法

有时候,也可能碰到这样面试题,如:

Java创建对象有哪几种方法?
除了new之外,java创建对象还有哪几种方式?

本文结合例子,给出几种Java创建对象的方法,包括:

  • 使用new创建
  • 使用Object.clone()
  • 使用Class.newInstance()
  • 使用Constructor.newInstance()
  • 使用反序列化

一、使用new创建

这是最常用的一种。

Book book = new Book();

编写一个Book类

package test;
import java.io.Serializable;import java.util.List;
/** * @author wangmengjun * */public class Book implements Serializable{
    private static final long serialVersionUID = -6212470156629515269L;
    /**书名*/    private String name;
    /**作者*/    private List<String> authors;
    /**ISBN*/    private String isbn;
    /**价格*/    private float price;
    public Book() {    }
    /**     * @param name     * @param authors     * @param isbn     * @param price     */    public Book(String name, List<String> authors, String isbn, float price) {        this.name = name;        this.authors = authors;        this.isbn = isbn;        this.price = price;    }
    /**     * @return the name     */    public String getName() {        return name;    }
    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }
    /**     * @return the authors     */    public List<String> getAuthors() {        return authors;    }
    /**     * @param authors the authors to set     */    public void setAuthors(List<String> authors) {        this.authors = authors;    }
    /**     * @return the isbn     */    public String getIsbn() {        return isbn;    }
    /**     * @param isbn the isbn to set     */    public void setIsbn(String isbn) {        this.isbn = isbn;    }
    /**     * @return the price     */    public float getPrice() {        return price;    }
    /**     * @param price the price to set     */    public void setPrice(float price) {        this.price = price;    }
    /* (non-Javadoc)     * @see java.lang.Object#toString()     */    @Override    public String toString() {        return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price="                + price + "]";    }
}

测试代码:

        /**         * 1. 使用new创建对象         */        Book book1 = new Book();        book1.setName("Redis");        book1.setAuthors(Arrays.asList("Eric", "John"));        book1.setPrice(59.00f);        book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");        System.out.println(book1);

二、使用object.clone()

如果要调用clone方法,那么该object需要实现Cloneable接口,并重写clone()方法。

修改后的Book类如下:

package test;
import java.io.Serializable;import java.util.List;
/** * @author wangmengjun * */public class Book implements Serializable, Cloneable {
    private static final long serialVersionUID = -6212470156629515269L;
    /**书名*/    private String name;
    /**作者*/    private List<String> authors;
    /**ISBN*/    private String isbn;
    /**价格*/    private float price;
    public Book() {    }
    /**     * @param name     * @param authors     * @param isbn     * @param price     */    public Book(String name, List<String> authors, String isbn, float price) {        this.name = name;        this.authors = authors;        this.isbn = isbn;        this.price = price;    }
    /**     * @return the name     */    public String getName() {        return name;    }
    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }
    /**     * @return the authors     */    public List<String> getAuthors() {        return authors;    }
    /**     * @param authors the authors to set     */    public void setAuthors(List<String> authors) {        this.authors = authors;    }
    /**     * @return the isbn     */    public String getIsbn() {        return isbn;    }
    /**     * @param isbn the isbn to set     */    public void setIsbn(String isbn) {        this.isbn = isbn;    }
    /**     * @return the price     */    public float getPrice() {        return price;    }
    /**     * @param price the price to set     */    public void setPrice(float price) {        this.price = price;    }
    /* (non-Javadoc)     * @see java.lang.Object#toString()     */    @Override    public String toString() {        return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price="                + price + "]";    }
    @Override    protected Object clone() throws CloneNotSupportedException {        return (Book) super.clone();    }
}

测试代码

        /**         * 1. 使用new创建对象         */        Book book1 = new Book();        book1.setName("Redis");        book1.setAuthors(Arrays.asList("Eric", "John"));        book1.setPrice(59.00f);        book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");        System.out.println(book1);
        /**         * 2. 使用clone创建对象         */        try {            Book book2 = (Book) book1.clone();            System.out.println(book2);        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }

三、使用Class.newInstance()

可以直接使用Class.forName("xxx.xx").newInstance()方法或者XXX.class.newInstance()完成。

        /**         * 3. 使用Class.newInstance();         */        try {            Book book3 = (Book) Class.forName("test.Book").newInstance();            System.out.println(book3);
            book3 = Book.class.newInstance();            System.out.println(book3);        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }

四、使用Contructor.newInstance()

可以指定构造器来创建,如选择第一个构造器创建;也可以指定构造函数参数类型来创建。

        /**         * 4. 使用Constructor.newInstance();         */        try {            //选择第一个构造器创建Book            Book book4 = (Book) Book.class.getConstructors()[0].newInstance();            //Book [name=null, authors=null, isbn=null, price=0.0]            System.out.println(book4);
            /**             * 调用指定构造函数创建对象             */            book4 = (Book) Book.class.getConstructor(String.class, List.class, String.class,                    float.class).newInstance("New Instance Example", Arrays.asList("Wang", "Eric"),                    "abc1111111-def-33333", 60.00f);            //Book [name=New Instance Example, authors=[Wang, Eric], isbn=abc1111111-def-33333, price=60.0]            System.out.println(book4);        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException                | InvocationTargetException | SecurityException | NoSuchMethodException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }
使用Class.newInstance()或者Contructor.newInstance(),其本质是一样的,都采用了反射机制。

五、使用反序列化

        /**         * 5. 使用反序列化         */        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("book.dat"));                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("book.dat"));) {            oos.writeObject(book1);
            Book book5 = (Book) ois.readObject();            System.out.println(book5);
        } catch (IOException | ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }

当然了,除了上述几种方式之外,还可以使用JNI等方式来创建对象,这边就不一一列举了。

本文分享自微信公众号 - 孟君的编程札记(gh_0f0f5e0ae1de)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java小白成长之路

第22次文章:建造者模式+原型模式

这周我们就可以把GOFO23设计模式中的创建型模式全部介绍完了!后面在项目里面可以试一下啦!

7530
来自专栏安恒网络空间安全讲武堂

LCTF2018-bestphp's revenge 详细题解

这里只需要关注call_user_func这个回调函数。 call_user_func — 把第一个参数作为回调函数调用,第一个参数是被调用的回调函数,其余参数...

10820
来自专栏后台及大数据开发

mybatis中collection association优化使用及多参数传递

注意:JsonIgnoreProperties请忽略,这是解决对象间循环依赖在json序列化时出错的,不在本次内容中

28610
来自专栏安恒网络空间安全讲武堂

EDU-CTF TripleSigma题解

EDU-CTF是台大、交大、台科大三个学校的校赛,题目感觉都不错。TripleSigma这道题的反序列化POP链很有意思,官方wp写的很简单,在这里分析一下。 ...

5520
来自专栏mukekeheart的iOS之旅

iOS学习——图片压缩到指定大小以内

  在我们开发过程中,有可能会遇到拍照、或者从相册中选择图片,要么单选或者多选,然后上传图片到服务器,一般情况下一张图片可能3-4M,如果类似微信朋友圈上传9张...

11220
来自专栏安恒网络空间安全讲武堂

HackIM 2019-Mime checkr

原文地址:http://www.mohamed-chamli.me/blog/hackim%202019/Mimecheckr

9420
来自专栏java架构学习交流

Spring Cloud微服务系列文,服务调用框架Feign架构师入门:搭建基本的Eureka架构(从项目里抽取)

之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明...

7130
来自专栏安恒网络空间安全讲武堂

JDCTF-web writeup

总共两个判断 第一个函数是 ereg可以用%00绕过 第二个函数 strpos用来判断该字符串中有没有 #biubiubiu 因为#在url中有特殊含义所以得用...

8910
来自专栏Java小白成长之路

第20次文章:内部类+单例设计模式

本周首先紧接上周没有写完的内部类,详情点击《第19次文章:类加载器的加密解密+内部类》,再加单例模式的实现。

7420
来自专栏从零开始学自动化测试

httprunner学习6-参数化(引用外部csv数据)

上一篇已经实现参数化,但是数据是放在.yml文件里面,当测试数据非常多的时候,我们希望把测试数据写到csv文件。 httprunner==1.5.8

16620

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励