总结java创建类的5种方式

  • 使用new关键字
  • 使用Class类的newInstance方法
  • 使用Constructor类的newInstance方法
  • 使用clone方法
  • 使用反序列化
  • IoC容器创建对象


使用new关键字

这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

Employee emp = new Employee();

使用Class类的newInstance方法

关于newInstance:

  • newInstance()和new()区别:

1、两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类

2、newInstance创建类是这个类必须已经加载过且已经连接,new创建类是则不需要这个类加载过

3、newInstance: 弱类型(GC是回收对象的限制条件很低,容易被回收)、低效率、只能调用无参构造,new 强类型(GC不会自动回收,只有所有的指向对象的引用被移除是才会被回收,若对象生命周期已经结束,但引用没有被移除,经常会出现内存溢出)

  • 伸缩、扩展性:

1、如果在接口的设计中很多类实现了该接口,我们只需要使用Class中的forName方法加载一下类就可以了,可以将这一段代码提出来作为一个工具类方法,不管有多少类只要实现了该接口我们只要传入需要实例化的路径名就可以实例化,这样大大节省了我们的代码。

这个方法创建对象其实我们用得也比较多,但是,这个newInstance方法调用无参的构造函数创建对象。所以类必须有public无参构造函数才行

Employee emp = (Employee) Class.forName("com.fsx.demo.mployee").newInstance();
或者
Employee emp = Employee.class.newInstance();

使用Constructor类的newInstance方法

和Class类的newInstance方法很像。但是它可以调用任意构造函数创建对象,包括私有的。(所以即使你私有了构造函数,spring还是可以给你创建对象)

事实上Class的newInstance方法内部调用Constructor的newInstance方法。
这也是众多框架,如Spring、Hibernate、Struts等直接使用后者的原因

使用clone方法

无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。
备注:要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

Employee emp4 = (Employee) emp2.clone();

使用反序列化

当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
备注:为了反序列化一个对象,我们需要让我们的类实现Serializable接口

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();

IoC容器创建对象

通过外部容器创建对象,不需要人为创建,可直接调用
备注:属于Spring框架内容