java中创建对象的几种方式

来源:互联网 发布:淘宝店铺开店教程 编辑:程序博客网 时间:2024/05/22 13:43

1. 使用new 关键字

使用 new 关键字创建对象,实际上是做了两个工作,一是在内存中开辟空间,二是初始化对象。但是new 关键字只能创建非抽象对象。

2. 使用反射创建对象

反射是对于任意一个正在运行的类,都能动态获取到他的属性和方法。反射创建对象分为两种方式,一是使用Class类的new Instance() 方法,二是使用Constructor类的new Instatnce() 方法。

两者区别在于:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

3. 使用clone方法

要拷贝的对象需要实现Cloneable类,并重写clone()方法。

4. 使用反序列化方式

当序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。为了反序列化一个对象,需要让类实现Serializable接口。然后在使用new ObjectInputStream().readObject() 来创建对象。

下面demo:

public class Order implements Cloneable, Serializable{    private String code;    private String name;    @Override    protected Object clone() throws CloneNotSupportedException {        return (Order)super.clone();    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Order order = (Order) o;        if (code != null ? !code.equals(order.code) : order.code != null) return false;        return name != null ? name.equals(order.name) : order.name == null;    }    @Override    public int hashCode() {        int result = code != null ? code.hashCode() : 0;        result = 31 * result + (name != null ? name.hashCode() : 0);        return result;    }    public String getCode() {        return code;    }    public void setCode(String code) {        this.code = code;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

4种方式。

    public static void main(String[] args) throws Exception {        // 1、使用new关键值创建对象        Order order1 = new Order();        order1.setCode("111");        order1.setName("订单1");        System.out.println(order1);        // 2、使用clone        Order order2 = new Order();        Object clone = order2.clone();        System.out.println(clone);        // 3、使用反射        Class c = Class.forName("cn.qidd.other.Order");        Object o = c.newInstance();        System.out.println(o);        // 4、反序列化        // 先序列化        Order order3 = new Order();        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("order.obj"));        os.writeObject(order3);        // 再反序列化        ObjectInputStream is = new ObjectInputStream(new FileInputStream("order.obj"));        Object o1 = is.readObject();        System.out.println(o1);    }
原创粉丝点击