java创建对象的四种方式

1. 使用 new 关键字

这是创建对象最常见的方式。通过使用 new 关键字,可以调用类的构造器(构造函数)来创建类的一个新实例。

MyClass obj = new MyClass();

在这里,MyClass() 调用的是类 MyClass 的构造器。

2. 使用 Class 类的 newInstance() 方法

Class 类提供了 newInstance() 方法,可以通过这个方法来创建类的实例。使用这种方式需要有无参构造函数。

MyClass obj = MyClass.class.newInstance();

或者

Class clazz = MyClass.class;
MyClass obj = clazz.newInstance();

从Java 9开始,newInstance() 方法已被废弃,因为它不够安全,它强制要求类必须有一个公开的无参构造函数,并且抛出的异常类型太过于宽泛。推荐使用 Class 类的 getDeclaredConstructor().newInstance() 方法来替代:

MyClass obj = MyClass.class.getDeclaredConstructor().newInstance();

3. 使用 clone() 方法

如果一个类实现了 Cloneable 接口,并重写了 clone() 方法,我们可以通过调用一个对象的 clone() 方法来创建一个新的对象副本。这种方法不会调用任何构造器。

MyClass original = new MyClass();
MyClass cloned = original.clone();

使用 clone() 方法时需要处理 CloneNotSupportedException 异常。

4. 使用对象序列化和反序列化

对象序列化是指将一个对象转换成字节序列的过程,而反序列化是指将字节序列恢复为对象的过程。通过序列化和反序列化,也可以创建对象。

// 序列化
FileOutputStream fos = new FileOutputStream("data.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
MyClass obj = new MyClass();
oos.writeObject(obj);
oos.close();
fos.close();

// 反序列化
FileInputStream fis = new FileInputStream("data.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
MyClass newObj = (MyClass) ois.readObject();
ois.close();
fis.close();

在进行反序列化创建对象时,Java虚拟机(JVM)会通过调用 readObject() 方法来创建新的对象,而不是调用任何构造器。为了进行序列化和反序列化,相应的类必须实现 Serializable 接口。

除了这四种常见的方式,还有其他技术可以用来创建对象,如通过反射的 Constructor 类的 newInstance() 方法,或者使用一些对象池技术等。然而,上述四种方法是在日常编程中最常见的。

你可能感兴趣的:(java,开发语言)