Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法。
总结下来有以下4种创建对象的方法:
使用 new 关键字调用对象的构造器;
使用 Java 反射的 newInstance() 方法;
使用 Object 类的 clone() 方法;
使用对象流 ObjectInputStream 的 readObject() 方法读取序列化对象;
1. 使用 new 关键字
最常见的 Java 对象的构造方法,通过调用类提供的构造器创建对象。
2. 使用 newInstance() 方法
Java 反射中有一个 newInstance() 方法,可以创建对象,步骤如下:
获取要创建的类的 Class 对象。
如果只需要调用这个类的访问权限为 public 无参构造器,直接使用 Class 类的实例方法 newInstance()。
获取 Class 对象的构造器对象,通过调用 Class 类的实例方法 getDeclaredConstractors() 来获取构造器对象的数组。(获取所有构造器,无视访问权限的限制,数组顺序按照代码中的顺序决定)
如果调用的构造器是 private 的,需要调用 Constractor 类的父类 AccessibleObject 类的实例方法 setAccessible(true) 来打破访问限制。
使用 Constractor 类的实例方法 newInstance()。
示例代码:
public class MethodNewInstance {
2
3 public static void main(String[] args) throws Exception {
4
5 // 得到类对象
6 Class<?> clazz = Class.forName("com.gerrard.create.method_newInstance.ObjectToCreate");
7 // 类对象的 newInstance() 方法,只能调用公有的无参构造器
8 clazz.newInstance();
9
10 // 得到构造器对象数组(不管是私有还是公有的构造器)
11 Constructor<?>[] cons = clazz.getDeclaredConstructors();
12 cons[1].newInstance();
13 cons[2].newInstance("Gerrard");
14 // 先打破私有构造器不可访问的限制
15 cons[0].setAccessible(true);
16 cons[0].newInstance("Gerrard", "Info");
17 }
18 }
备注:
获取 Class 对象的方法有3个,此处不多赘述。
获取 Constractor 对象的方法有4个,此处不多赘述。
3. 使用 clone() 方法
Object 类是所有类的直接或间接父类,Object 类中提供了 实例方法 native(),在给定对象的基础上,创建一个完全相同的对象。步骤如下:
想要使用 clone() 方法创建对象的类,实现 Cloneable 接口。
在类的内部,重写 Object 类的 clone() 方法。
示例代码:
1 public class ObjectToCreate implements Cloneable {
2
3 // 重写 Object 类的 clone() 方法(native 方法)
4 public ObjectToCreate clone() {
5 ObjectToCreate obj = null;
6 try {
7 obj = (ObjectToCreate) super.clone();
8 } catch (CloneNotSupportedException e) {
9 // 没有实现 Cloneable 接口就会抛出这个异常
10 e.printStackTrace();
11 }
12 return obj;
13 }
14 }
备注:
没有实现 Cloneable 接口,会抛出 CloneNotSupportedException 异常。
Object 类提供的 clone() 方法,访问权限是 protected,所以如果不重写 clone() 方法,是没有权限调用的。
Object 类的 clone() 方法,是 native 方法。
© 牛耳教育|长沙java培训|长沙java培训学校|长沙软件培 | Powered by LOFTER