JavaSE之创建对象的几种方法

JavaSE之创建对象的几种方法

第一种:new

这个是Java中最普遍的创建对象的方法。示例如下:

Dog dog = new Dog();

第二种:反射

Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。

反射的作用:

  1. 可以通过反射机制发现对象的类型,找到类中包含的方法、属性和构造器。
  2. 可以通过反射创建对象并访问任意对象方法和属性。

怎样通过反射获取对象呢?

  1. 先获取class对象(这个对象比较特殊),获取的方式很简单:
Class class_ = Dog.class;
  1. 接下来利用这个class对象获取对象(注意:获取时需要类型强转,原因:返回的对象是Object类型的):
Dog dog = (Dog)class_.newInstance();

那反射和直接new出对象的区别在哪呢?
反射的newInstance()方法只能调用类的默认构造方法,即无参构造,而new可以调用任意public类型的构造方法。
注意: 类是默认含有一个无参构造的,如果显式声明了一个构造方法,则不会提供默认的无参构造了,如果此时类中没有无参的构造方法,使用反射的newInstance方法则会报错java.lang.InstantiationException,所以一般而言,类中有显式构造方法时,最好手动声明一个无参构造。

第三种:对象拷贝

对象拷贝分为两种:深拷贝和浅拷贝

深拷贝

定义:
拷贝时其成员变量如果是基本数据类型则拷贝数值,而如果是引用类型则其引用的对象也创建一遍(并把原对象的值全复制到这个对象中)。
深拷贝实现方式:

  1. 原对象及其成员变量中的引用类型都要实现Cloneable接口,并重写继承自Object对象的clone方法,然后直接调用原对象的clone()方法即可。代码示例:
Dog dog2 = (Dog)dog.clone();
  1. 使用反序列化生成对象:
    此时原对象需要实现Serializable接口,但是不需要重写任何方法,Serializable接口只是类似于一种标记(表示这个类生成的对象可以进行序列化),序列化完后再反序列化即可。代码示例:
		Dog dog = new Dog();
		// 序列化
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        
        // 对象写入
        oos.writeObject(dog);

        // 反序列化
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
		
		// 对象读取
		Dog dog2 = ois.readObject();

当然,这段代码感觉这个反序列化没啥用,哈哈,其实我这里代码只是用来演示,实际上你需要进行反序列化的时候是可以从硬盘,网络等媒介上获取对象的,同样,你也可以将对象序列化到网络,硬盘等中,可以以后通过反序列化来获取对象。

浅拷贝

浅拷贝仅仅复制原对象,而不复制它所引用的对象(原对象中成员变量中引用的对象)。
实现方式:
与深拷贝相比,原对象的成员变量中的引用类型不需要实现Cloneable接口,只有原对象本身需要实现该接口,并重写来自Object对象的clone()方法。代码示例:

Dog dog3 = (Dog)dog.clone();
发布了14 篇原创文章 · 获赞 15 · 访问量 530

猜你喜欢

转载自blog.csdn.net/CodingNO1/article/details/104241273