1.通过new 关键字创建对象
例如:
person1是一个对象引用,Person是对象名字,"()"对应的是无参构造函数,当我们使用new创建了一个对象时,会在栈中创建person1这个引用,并且在堆中开辟一块空间存放对象的值,然后让person1这个引用指向堆中新建的Person对象的值,要注意的是,不管每次创建的对象的值是否相同,每次用new创建对象时,在栈中创建的引用都是不一样的,即地址都是不一样的。
输出结果:
2.调用newInstance方法
例如:
Class.forName("全限定名")负责加载类,它返回一个类,Class.forName("xxx").newInstance()方法返回实例化对象
newInstance与new的区别:1.new是个关键字,newInstance是个方法。2.new实例化对象不需要加载类,new实例化对象是一步完成的,而newInstance需要先加载类,再通过获的类实例化对象,将实例化对象分成了了两步。3.new关键字实例化对象可以调用任意构造函数,而newInstance实例化对象只能调用类的无参构造函数
截取newInstance的部分源码可知,当temConstructor即无参构造函数为null时,抛出IllegalAccesExceptionyichan异常。
3.Constructor类中的newInstance方法
与之前的Class类中的newInstance相似,Constructor类中也有一个newInstance方法,可以调用有参构造函数和私有构造函数,这两种创建对象的方式都属于反射。
例如:
Constructor.newInstance与Class.newInstance的区别:
Constructor.newInstance只能调用无参构造函数实例化对象,而Class.newInstance在一定条件下可以调用有参构造函数和私有构造函数
4.clone()
clone()是Object类的方法,但是想要使用必须实现Clonable接口,要注意的是clone()方法只会进行浅复制,也就是说只会在栈中再创建一个引用指向原来的对象的值所处的堆空间中,堆中的对象的值还是原来的并没有重新创建。另外,使用clone()方法并不需要调用造函数
5.反序列化
要想通过反序列化创建对象,就必须现将某个对象序列化
概念:
1.序列化:将java对象转化为字节流或字符流的过程,作用:1.便于在网络上进行传输,2.将java字节序列永久保存在硬盘上,通常放在文件中,所以序列化也可以叫做持久化。
2.反序列化:将字节流或字符流对象转化成java对象的过程
java对象的序列化:
序列化前personFile.txt是空的
将代码运行序列化后:
文件中就有东西了
反序列化:
执行结果:
这个person对象就是从之前序列化在personFile.txt中获取到的。