对象的创建方式

一、new对象

二、反射

1、首先获取class对象:
1)类名.class
2)对象名.getclass()
3)Class.forName(“全限定名”)

1.1、通过class对象调用无参构造方法创建对象:
1)class对象名.newInstance()

1.2、通过class对象调用有参构造方法创建对象:
1)class对象名.getDeclaredConstructors(),返回所有构造方法类Constructor组成的数组

2)class对象名.getDeclaredConstructors(参数列表数据类型),返回指定Constructor类

三、克隆对象

1、克隆的内容:
1)基本数据类型:使用值传递
2)引用数据类型:使用引用传递

2、克隆的方式:
2.1、浅克隆:
(1)原理:
对象的基本数据类型的字段,全部赋值到克隆对象中;
对象的引用数据类型的字段,只是引用地址,原对象和克隆对象指向同一个引用;

(2)实现:
将原对象的类实现Cloneable接口,然后重写clone()方法;
注意:clone()方法属于Object类,Cloneable接口没有定义任何方法
(3)效果:
当原对象的引用数据类型字段改变时,克隆对象对应的字段有相应的改变;

2.2、深克隆:
(1)原理
对象的基本数据类型的字段,全部复制到克隆对象中;
对象的引用数据类型的字段,会复制一份,然后克隆对象指向该引用,原对象和克隆对象分别指向各自的引用;

(2)实现
原对象的引用类型字段的类实现Cloneable接口,重写clone()方法;
原对象本身同样实现Cloneable接口,重写clone()方法,并在重写过程中调用引用类型字段的clone()方法,克隆引用类型字段;

(3)效果
原对象和克隆对象的引用数据类型字段相互独立;

四、反序列化对象

1、认识序列化和反序列化
1)序列化:把Java对象转换成字节序列,方便持久化到硬盘中
2)反序列化:将字节序列恢复为Java对象

2、实现序列化和反序列化
(1)前提:需要序列化的对象必须实现Serializable接口,该接口没有定义任何方法;

2.1、实现序列化
1)字节流;将Java对象封装成ObjectOutputStream,可使用OutputStream相关的IO流;
2)调用writeObject(),写入指定的文件中;

2.2、实现反序列化
1)将序列化的文件封装成ObjectInputStream,可使用InputStream相关的IO流;
2)调用readObject(),返回原Java对象;

3、控制序列化过程
3.1、serialVersionUID进行版本控制
1)作用:对已经序列化的对象,可通过serialVersionUID判断后面是否再次修改过,保证反序列化后的对象的正确性;
2)用法:不显式给类加上,则默认生成一个;建议显式加上;
3)规则:实现Serializable接口的类,每次修改后,该UID都会改变;

3.2、transient控制不想序列化的属性字段
1)作用:对于不想序列化的字段,如私密属性,则可以在字段前使用transient进行修饰;
2)效果:在字段反序列化后,引用数据类型的字段值为null