Java创建对象四种方式
1.new
2.clone
3.newInstance
4.反序列化
一.NEW
User user=new User();
二.反射
通过反射来生成对象有如下两种方式:
(1)使用Class对象的newInstance()方法来创建该Class对象对应类的实例。但是这种方式要求该Class对象的对应类有默认的构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。
(2)先使用Class对象获取指定的Constructor对象,再调用Construtor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例;
三个步骤:
(1)获取该Class对象;
(2)利用该Class对象的getConstrutor方法来获取指定的构造器;
(3)调用Construtor的newInstance方法来创建Java对象。
总结:其实就是使用类默认或者构造器的使用newInstance()方法进行对象的创建;
Object invoke(Object obj,Object... args);该方法中的obj是执行该方法的主调,后面的args是执行该方法时传入该方法的实参。
2.调用方法
当通过Method的invoke方法来调用对应的方法时,Java会要求程序必要要有调用该方法的权限。如果程序确实需要调用该对象的私有方法,则可先调用Method对象的:
setAccessible(boolean flag);方法,将Method对象的accessoble标志设置为指示的布尔值。
布尔值为true,则表示该Method在使用时应该取消Java语言访问权限检查;
布尔值为false,则表示该Method在使用时应该实施Java语言访问权限检查;
3.访问属性值
通过Class对象的getFields或getField方法;
三.利用反序列化创建对象
一.why?
- 被垃圾回收的对象的状态(对象的生命周期结束),对象里面的属性无法保留,需要重新进行初始.所以使用序列化可以保存对象的状态;
- 进行对象序列化的话的主要原因就是实现对象持久化和进行网络传输
二.how?
- 实现Serializable接口
该接口仅是一个标志,告诉JVM该类的对象可以被序列化。如果某类未实现Serializable接口,则该类对象不能实现序列化。
2.进行序列化主要用到的流是FileOutputStream和ObjectOutputStream。
- FileOutputStream主要用于连接磁盘文件,并把字节写出到该磁盘文件;
- ObjectOutputStream主要用于将对象写出为可转化为字节的数据。
3.保存状态的目的就是为了在未来的某个时候再恢复保存的内容,这可以通过反序列化来实现。
- 与序列化正好相反,主要用到的两个流是FileInputstream和ObjectInputStream。
- 反序列化后得到的对象的顺序与保存时的顺序一致。
四.clone创建对象
一.what?
使用条件:
- A与B是两个独立的对象,但B的初始值是由A对象确定
实现clone()方法是其中最简单,也是最高效的手段;
JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
二.方法(略)
- Clone&Copy
- Shallow Clone&Deep Clone
- Clone()方法的保护机制
- Clone()方法的使用
Clone()方法的使用比较简单,注意如下几点即可:
a. 什么时候使用shallow Clone,什么时候使用deep Clone,这个主要看具体对象的域是什么性质的,基本型别还是reference variable
b. 调用Clone()方法的对象所属的类(Class)必须implements Clonable接口,否则在调用Clone方法的时候会抛出CloneNotSupportedException。
引用: