Java中生成对象有四种方法,可以分成两大类,调用构造函数和不调用构造函数。
1. 调用构造函数
1.1 使用 new 关键字 创建对象
这是最简单的方式,也是最常用的方式
String str = new String();
1.2 使用反射技术
Reflection(反射)是动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性和方法。
1.2.1 类的字节码文件
可以通过下面三种方式获取
- 通过类名获取:类名.class //返回该类的字节码文件,不会加载静态初始化块
- 通过对象名获取 对象名.getClass(); //返回该对象所对应的类的class对象
- 通过全限定名获取,Class.forName(“类的全限定名”) //通过加载类取得与该类对应的反射对象
1.2.2 通过反射创建java对象(需要调用构造函数)
- 得到要创建对象的class对象,用上面提到的三种方式
- 利用下面两种方式反射对象
- 调用无参构造器 ,若是没有,则会报异常
Object o = class.newInstance();
- 有带参数的构造函数的类,先获取到其构造对象, 再通过该构造方法类获取实例:
//获取构造函数类的对象
Constructor constructor = class.getConstructor(String.class,Integer.class); /
// 使用构造器对象的newInstance方法初始化对象
Object obj = constroctor.newInstance(“哈哈”, 20);
2. 不调用构造函数
2.1 调用对象的clone()方法(浅拷贝)
- 实现clone的类首先需要继承Cloneable接口实质上是一个标识接口,没有任何的接口方法.
- 被克隆的类要重写 clone()方法.
要求重写是为了在后续代码中可以很好的使用,比如我们需要深拷贝的时候,有个字段是这个类的实例对象,那么可以直接通过这个对象.clone()方法来进行深拷贝。 - 调用clone方法
2.2 使用反序列化
使用io流中的对象输入输出流进行。需要实现序列化接口。
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) {
ObjectName obj = ois.readObject();
}