[日报] java创建对象的四种方式

目录

一、使用new关键字

二、使用Class类的newInstance()方法

三、使用clone()方法

四、使用Deserialization(反序列化)

附  Java类的生命周期

1.加载(Loading)

2.验证(Verification)

3.准备(Preparation)

4.解析(Resolution)

5.初始化(Initialization)

6.使用(Using)

7.卸载(Unloading)


一、使用new关键字

这是最常见的创建对象的方式。它会为对象分配内存并调用相应的构造方法。下面是使用 new 关键字创建对象的步骤:

  1. 声明一个类,例如 MyClass
  2. 使用 new 关键字创建一个 MyClass 类型的对象,例如 MyClass obj = new MyClass();
  3. 这个过程会为对象分配内存并调用相应的构造方法。这里的 MyClass 是一个类,obj 是新创建的 MyClass 类型的对象。
MyClass obj = new MyClass();

这里MyClass是一个类,obj是新创建的MyClass类型的对象。

二、使用Class类的newInstance()方法

Java 中的反射机制可以在运行时动态地获取类的信息并调用类的方法。使用反射机制创建对象的步骤如下:

  1. 获取类的 Class 对象,例如 Class<?> cls = Class.forName("MyClass");
  2. 通过 Class 对象获取构造方法,例如 Constructor<?> constructor = cls.getConstructor();
  3. 通过构造方法创建对象,例如 Object obj = constructor.newInstance();
MyClass obj = (MyClass) Class.forName("MyClass").newInstance();

这个方法需强制转换为相应类型,而且可能抛出多种异常,比如ClassNotFoundExceptionInstantiationExceptionIllegalAccessException。自Java 9开始,newInstance方法已被标记为废弃,并推荐用Class.getDeclaredConstructor().newInstance()代替。

三、使用clone()方法

Java 中的 Object 类提供了一个 clone() 方法,可以用来复制一个对象。使用 clone() 方法创建对象的步骤如下:

  1. 实现 Cloneable 接口,例如 public class MyClass implements Cloneable { ... }
  2. 调用 clone() 方法,例如 MyClass obj2 = (MyClass) obj1.clone();
MyClass obj1 = new MyClass();
MyClass obj2 = (MyClass) obj1.clone();

使用这个方法,类需要覆盖Object类的clone()方法。同时要注意这个方法创建的新对象在内存中有独立的空间,但并不会调用构造函数。

四、使用Deserialization(反序列化)

Java 中的反序列化可以将对象从文件或网络中读取出来。使用反序列化创建对象的步骤如下:

  1. 实现 Serializable 接口,例如 public class MyClass implements Serializable { ... }
  2. 将对象序列化到文件或网络中。
  3. 从文件或网络中读取对象并进行反序列化,例如 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 不再需要加载某个类时,会卸载该类,释放内存空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值