ITPub博客

首页 > 应用开发 > Java > 五种方法创建java对象,你知道几种呢?

五种方法创建java对象,你知道几种呢?

原创 Java 作者:码邦主666 时间:2020-11-14 11:46:45 0 删除 编辑

五种方法创建java对象

作为 Java开发人员,我们通常每天都会创建许多对象,但是我们总是使用新的或依赖管理系统(例如 Spring)来创建这些对象。但是,有更多方法可以创建本文中将要研究的对象。

用Java创建对象的共有5种核心方式,下面将以其示例加以说明,然后介绍创建对象的行的字节码。但是,有很多API可以为我们创建对象,但是这些API还将间接使用这5种核心方式之一,例如 Spring BeanFactory。

 

 

如果您将执行最后给出的程序,则会看到方法1、2、3使用构造函数创建对象,而4、5没有调用构造函数创建对象。

 

1.使用新关键字

这是创建对象的最常见和常规的方法,也是一种非常简单的方法。通过使用此方法,我们可以调用要调用的任何构造函数(无参数的构造函数和参数化的)。

1
Employee emp1 =  new  Employee();

  

 

 

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

我们还可以使用 Class类的 newInstance()方法创建一个对象。此 newInstance()方法调用 no-arg构造函数来创建对象。

我们可以通过 newInstance()通过以下方式创建对象:

1
2
3
4
Employee emp2 = (Employee) Class.forName( "org.programming.mitra.exercises.Employee" ).newInstance();
Or
 
Employee emp2 = Employee. class .newInstance();

  

 

3.使用构造方法类的newInstance()方法

与 Class类的newInstance()方法类似, java.lang.reflect.Constructor类中有一个 newInstance()方法可用于创建对象。我们还可以使用此 newInstance()方法来调用参数化构造函数和私有构造函数。

1
2
3
Constructor<Employee> constructor = Employee. class .getConstructor();
 
Employee emp3 = constructor.newInstance();

  

 

这两种 newInstance()方法都被称为创建对象的反射方式。实际上, Class类的 newInstance()方法在内部使用了 Constructor类的 newInstance()方法。这就是为什么最好使用后一种方法,并且也将其用于诸如 Spring,Hibernate,Struts等不同框架的原因。要了解这两种newInstance()方法之间的区别,请阅读使用Example在Java中通过Reflection创建对象。

 

4.使用clone()方法:

每当我们在任何对象上调用 clone()时,JVM实际上都会为我们创建一个新对象,并将先前对象的所有内容复制到其中。使用 clone方法创建对象不会调用任何构造函数。

要在对象上使用 clone()方法,我们需要实现 Cloneable并在其中定义 clone()方法。

1
Employee emp4 = (Employee) emp3.clone();

  

 

Java克隆是Java社区中最值得探讨的话题,它的确有其缺点,但是在对象完全满足Java克隆的强制条件之前,它仍然是创建任何对象的副本的最流行和最简单的方法。

 

5.使用反序列化

每当我们序列化然后反序列化一个对象时, JVM就会为我们创建一个单独的对象。在反序列化中,JVM不使用任何构造函数来创建对象。要反序列化对象,我们需要在类中实现Serializable接口。

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

  

 

正如我们在上面的字节码中看到的那样,所有四个方法调用都转换为invokevirtual(这些方法直接处理对象的创建),除了第一个转换为两个调用的方法是一个是新的,另一个是调用特殊的(对构造函数的调用)。

例:
让我们考虑一个我们要为其创建对象的 Employee类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class  Employee  implements  Cloneable, Serializable {
 
     private  static  final  long  serialVersionUID = 1L;
 
     private  String name;
 
     public  Employee() { System.out.println( "Employee Constructor Called..." ); }
 
     public  String getName() {  return  name; }
 
     public  void  setName(String name) {  this .name = name; }
 
     @Override
     public  boolean  equals(Object o) {
         if  ( this  == o)  return  true ;
         if  (o ==  null  || getClass() != o.getClass())  return  false ;
         Employee employee = (Employee) o;
         return  Objects.equals(name, employee.name);
     }
 
     @Override
     public  int  hashCode() {  return  Objects.hash(name); }
 
     @Override
     public  String toString() {  return  String.format( "Employee{name='%s'}" , name); }
 
     @Override
     public  Object clone() {
         Object obj =  null ;
         try  {
             obj =  super .clone();
         }  catch  (CloneNotSupportedException e) {
             e.printStackTrace();
         }
         return  obj;
     }
}

  

 

在下面的Java程序中,我们将以所有5种方式创建Employee对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public  class  ObjectCreation {
     public  static  void  main(String... args)  throws  Exception {
 
         // 1. Using new keyword
         Employee emp1 =  new  Employee();
         emp1.setName( "emp1" );
  
         // 2. Using Class class's newInstance() method
         Employee emp2 = Employee. class .newInstance();
         emp2.setName( "emp2" );
  
         // 3. Using Constructor class's newInstance() method
         Constructor<Employee> constructor = Employee. class .getConstructor();
         Employee emp3 = constructor.newInstance();
         emp3.setName( "emp3" );
 
         // 4. Using clone() method
         Employee emp4 = (Employee) emp3.clone();
         emp4.setName( "emp4" );
  
         // Serialization
         try  (ObjectOutputStream out =  new  ObjectOutputStream( new  FileOutputStream( "data.obj" ))) {
             out.writeObject(emp4);
         }
 
         // 5. Using Deserialization
         Employee emp5;
         try  (ObjectInputStream in =  new  ObjectInputStream( new  FileInputStream( "data.obj" ))) {
             emp5 = (Employee) in.readObject();
             emp5.setName( "emp5" );
         }
 
         System.out.println(emp1 +  ", hashcode : "  + emp1.hashCode());
         System.out.println(emp2 +  ", hashcode : "  + emp2.hashCode());
         System.out.println(emp3 +  ", hashcode : "  + emp3.hashCode());
         System.out.println(emp4 +  ", hashcode : "  + emp4.hashCode());
         System.out.println(emp5 +  ", hashcode : "  + emp5.hashCode());
     }
}

  

该程序将给出以下输出:

1
2
3
4
5
6
7
8
Employee Constructor Called...
Employee Constructor Called...
Employee Constructor Called...
Employee{name= 'emp1' }, hashcode :  3117192
Employee{name= 'emp2' }, hashcode :  3117193
Employee{name= 'emp3' }, hashcode :  3117194
Employee{name= 'emp4' }, hashcode :  3117195
Employee{name= 'emp5' }, hashcode :  3117196

  

完整的Java初级,高级对应的学习路线和资料!专注于java开发。分享java基础、原理性知识、JavaWeb实战、spring全家桶、设计模式、分布式及面试资料、开源项目,助力开发者成长!


最后

给正在学习或者即将学习Java的同学推荐一下,Java要学到什么程度才能找工作,或者说Java最新的学习路线

推荐阅读:2020年最新Java学习路线?阅读量10万

学习不要走马观花的学,每个知识重点大纲,就是学习路线都是根据每一天市场上多数公司用到的新技术整理,在学习的时候还需要结合练习题来做

这里的话我也将我之前在学习过程中用到的一些学习资料整理成了文档,以及我自身之前的一个面试文案和知识点补充,有需要的朋友可以加我的QQ群  697888503(加群备注:博客)  ,这里也希望大家最终都能够学有所成,学习编程不是一天两天的功夫,勤能补拙才是硬道理,祝大家最终都能成为一名合适开发攻城狮。 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69985551/viewspace-2734153/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-10-16

  • 博文量
    141
  • 访问量
    79736