java创建对象的方式有几种?
四种。
1)通过new语句实例化一个对象。
2)通过反射机制创建对象。
3)通过clone()方法创建一个对象。
4)通过反序列化的方式创建对象。

之前总是死记硬背,通过女朋友的督促,决定好好整理一下。

对象:把数据以及操作数据的方法放在一起,作为一个相互依存的整体,这个整体就是对象。

方法一:
通过new语句实例化一个对象。

如:Person p = new Person();
即通过new语句调用相应类中的构造方法(包括祖先类的构造方法),来完成内存的分配以及变量的初始化工作,然后将分配的内存地址返回给所定义的变量。
它的实质就是实例化对象以后,对象就会有自己的堆内存空间。

方法二:
反射机制创建对象

反射机制:
是一个比较重要的特性,通俗的讲,通过反射机制,在运行状态中的任意一个类,对我们来说都是透明的。在程序运行的时候进行自我检查,同时也允许对其内部成员进行操作。
总的来说反射机制提供的功能主要有:
1)得到对象所属的类。
2)获得一个类的所有成员变量和方法。
3)运行时创建对象。
4)在运行时调用对象的方法。

能够获取到Class类的三种方法:
1)Class.forName(“类的路径”)
2)类名.Class
3)实例.getClass()

而这里的创建对象方式:

//Sub类还没有加载,在源文件阶段获取其字节码文件对象
Class cls = Class.forName("Reflect.User");
//创建user实例,这里通过User的无参构造函数来创建的对象
User user = (User)cls.newInstance();

方法三:
clone()方法创建一个对象。
经常会遇到从某个已经有的对象A创建出另一个与A具有相同状态的对象B,并且希望对B的修改不会影响到A。所以Java提供了clone()方法来满足这个需求。

clone()方法继承自Object类。这个复制函数返回的是一个新的对象而不是一个引用。
而java中也存在深浅复制之分,当类中只有些基本的数据类型时,可以使用浅复制,但是当类中包含了一些对象时,就需要用到深复制了。
浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制把复制的对象所引用的对象都复制了一遍。

方法四:
反序列化创建对象。
序列化:把对象转换为字节序列的过程。
反序列化:把字节序列恢复为对象的过程。

//创建student对象
Student student = new Student(1, "1234", "小明");
//序列化
byte[] bytes = toBytes(student);
System.out.println(bytes.length);
//反序列化
Student student0 = (Student) toObj(bytes);
System.out.println(student0);

输出结果:
111
Student{id=1, code='1234', name='小明'}