一、使用new关键字
通过new 类名()调用类的构造方法来创建类的对象,是开发中最常用的方式,直接调用,可控性强。
示例代码:创建Person类

通过new关键字创建Person类的实例对象

运行结果:

二、使用反射机制,通过class类的getDeclaredConstrustor().newInstance()方法
利用 Java 反射机制,通过类的 Class 对象调用newInstance()方法创建对象(JDK9 后标记为过时,推荐用getDeclaredConstructor().newInstance())。
特点:
Ⅰ.动态创建对象,适合框架开发(如spring)
Ⅱ.需要处理异常,且必须保证类有可访问的构造方法。
示例代码:

运行结果:

三、使用反射机制,通过Constructor类的newInstance()方法
相较于Class.newInstance()方法,该方法支持调用私有构造方法,更加灵活
特点:
Ⅰ.可以指定调用任意构造方法(包括有参、私有)
Ⅱ.反射相关的方式都存在一定的性能开销,非必要不滥用
示例代码:

运行结果:

四、使用克隆机制
1、浅度克隆
克隆基本数据类型,但不会克隆引用数据类型,二者是共享一个引用数据类型的变量
示例代码:
创建Manager类

创建Employee类

在main函数中进行测试:

运行结果:

2、深度克隆
既会克隆基本数据类型,也会克隆引用数据类型。
示例代码:
创建Manager类

创建Employee类

在main函数中测试:

运行结果:

五、通过反序列化
将序列化的对象字节流恢复为对象,要求类实现Serializable接口
示例代码:
修改Person类,继承 Serializable接口

通过反序列化创建对象

运行结果:

六、使用工厂模式
在工厂模式中,创建对象
示例代码:场景有两个汽车工厂可以生产汽车:A工厂和B工厂
1、创建生产汽车的接口

2、创建类FactoryA

3、创建类FactoryB

4、创建工厂类ProduceFactory

5、测试工厂模式

运行结果:

总结:
以上就是本次介绍的6中创建对象的方式,下面总结一下这几种方式的使用到的关键字和适用场景
|
对象的创建方式 |
使用的关键字 |
是否调用构造函数 |
适用场景 |
|
new 关键字 |
new ClassName() |
是 |
常规业务场景、明确知道类名的场景 |
|
克隆 |
Object.clone ()、继承Cloneable 接口 |
否 |
快速复制对象(如原型模式) |
|
反射 |
getDeclaredConstructor().newInstance() (JDK9+);Constructor类的newInstance() |
是 |
框架开发(如 Spring)、动态代理 |
|
反序列化 |
实现Serializable接口 |
否 |
网络传输、持久化(如文件 / 数据库) |
|
工厂模式 |
在工厂内部自定义 |
是 |
复杂对象创建、多产品族场景 |


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



