目录
一、使用new关键字
这是最常见的创建对象的方式。它会为对象分配内存并调用相应的构造方法。下面是使用 new 关键字创建对象的步骤:
- 声明一个类,例如
MyClass。 - 使用
new关键字创建一个MyClass类型的对象,例如MyClass obj = new MyClass();。 - 这个过程会为对象分配内存并调用相应的构造方法。这里的
MyClass是一个类,obj是新创建的MyClass类型的对象。
MyClass obj = new MyClass();
这里MyClass是一个类,obj是新创建的MyClass类型的对象。
二、使用Class类的newInstance()方法
Java 中的反射机制可以在运行时动态地获取类的信息并调用类的方法。使用反射机制创建对象的步骤如下:
- 获取类的
Class对象,例如Class<?> cls = Class.forName("MyClass");。 - 通过
Class对象获取构造方法,例如Constructor<?> constructor = cls.getConstructor();。 - 通过构造方法创建对象,例如
Object obj = constructor.newInstance();。
MyClass obj = (MyClass) Class.forName("MyClass").newInstance();
这个方法需强制转换为相应类型,而且可能抛出多种异常,比如ClassNotFoundException,InstantiationException或IllegalAccessException。自Java 9开始,newInstance方法已被标记为废弃,并推荐用Class.getDeclaredConstructor().newInstance()代替。
三、使用clone()方法
Java 中的 Object 类提供了一个 clone() 方法,可以用来复制一个对象。使用 clone() 方法创建对象的步骤如下:
- 实现
Cloneable接口,例如public class MyClass implements Cloneable { ... }。 - 调用
clone()方法,例如MyClass obj2 = (MyClass) obj1.clone();。
MyClass obj1 = new MyClass();
MyClass obj2 = (MyClass) obj1.clone();
使用这个方法,类需要覆盖Object类的clone()方法。同时要注意这个方法创建的新对象在内存中有独立的空间,但并不会调用构造函数。
四、使用Deserialization(反序列化)
Java 中的反序列化可以将对象从文件或网络中读取出来。使用反序列化创建对象的步骤如下:
- 实现
Serializable接口,例如public class MyClass implements Serializable { ... }。 - 将对象序列化到文件或网络中。
- 从文件或网络中读取对象并进行反序列化,例如
ObjectInputStream in = new ObjectInputStream(new FileInputStream("file.txt")); MyClass obj = (MyClass) in.readObject();。
ObjectInputStream in = new ObjectInputStream(new FileInputStream("objdata.ser"));
MyClass obj = (MyClass) in.readObject();
in.close();
objdata.ser是一个包含有对象序列化信息的文件,readObject()方法会将这些信息转换成对象实例。这同样并不会调用构造函数。
在以上任一方式下,如果类还未被加载,则会触发加载过程。类加载之后,只有在创建对象时才会为类的实例分配堆内存,设置对象头,并调用构造器。这个过程是在类的生命周期中的“使用”(Using)阶段。
附 Java类的生命周期
1.加载(Loading)
通过全类名获取定义此类的二进制字节流,将字节流所代表的静态存储结构转换为方法区的运行时数据结构,在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口。
2.验证(Verification)
确保加载的类信息符合 JVM 规范,例如:语法、语义等。
3.准备(Preparation)
为类的静态变量分配内存并设为 JVM 默认的初值,对于非静态的变量,则不会为它们分配内存。
4.解析(Resolution)
将常量池中的符号引用转换为直接引用。
5.初始化(Initialization)
为类的静态变量赋予程序员在代码中指定的初值,执行类构造器(类构造器是类的静态初始化方法,由编译器自动收集类中的所有类变量的赋值动作和静态语句块中的语句合并产生的)。
6.使用(Using)
JVM 在执行过程中,若发现需要使用到类,则会执行该类的初始化操作。
7.卸载(Unloading)
当 JVM 不再需要加载某个类时,会卸载该类,释放内存空间。
1506

被折叠的 条评论
为什么被折叠?



