Java中五种不同方法的创建对象
前言
作为Java开发者,我们每天都会创建大量的对象,但是,我们总是使用管理依赖系统(如Spring框架)来创建这些对象。其实还有其他方法可以创建对象,在接下来的文章中我会进行详细介绍。
1.使用new关键字
这是最常见的创建对象的方法,并且也非常简单。通过使用这种方法我们可以调用任何我们需要调用的构造函数。
Employeeemp1=newEmployee(); 0:new#19//classorg/programming/mitra/exercises/Employee 3:dup 4:invokespecial#21//Methodorg/programming/mitra/exercises/Employee."":()V
2.使用class类的newInstance方法
我们也可以使用class类的newInstance方法来创建对象。此newInstance方法调用无参构造函数以创建对象。
我们可以通过newInstance()用以下方式创建对象:
Employeeemp2=(Employee)Class.forName("org.programming.mitra.exercises.Employee").newInstance();
或者
Employeeemp2=Employee.class.newInstance(); 51:invokevirtual#70//Methodjava/lang/Class.newInstance:()Ljava/lang/Object;
3.使用构造函数类的newInstance方法
与使用class类的newInstance方法相似,java.lang.reflect.Constructor类中有一个可以用来创建对象的newInstance()函数方法。通过使用这个newInstance方法我们也可以调用参数化构造函数和私有构造函数。
Constructor<Employee>constructor=Employee.class.getConstructor(); Employeeemp3=constructor.newInstance(); 111:invokevirtual#80//Methodjava/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;
这些newInstance()方法被认为是创建对象的反射手段。实际上,内部类的newInstance()方法使用构造函数类的newInstance()方法。这就是为什么后者是首选并且使用不同的框架如Spring,Hibernate,Struts等。
4.使用clone方法
实际上无论何时我们调用clone方法,JAVA虚拟机都为我们创建了一个新的对象并且复制了之前对象的内容到这个新的对象中。使用clone方法创建对象不会调用任何构造函数。
为了在对象中使用clone()方法,我们需要在其中实现可克隆类型并定义clone方法。
Employeeemp4=(Employee)emp3.clone(); 162:invokevirtual#87//Methodorg/programming/mitra/exercises/Employee.clone()Ljava/lang/Object;
5.使用反序列化
无论何时我们对一个对象进行序列化和反序列化,JAVA虚拟机都会为我们创建一个单独的对象。在反序列化中,JAVA虚拟机不会使用任何构造函数来创建对象。
对一个对象进行序列化需要我们在类中实现可序列化的接口。
ObjectInputStreamin=newObjectInputStream(newFileInputStream("data.obj")); Employeeemp5=(Employee)in.readObject(); 261:invokevirtual#118//Methodjava/io/ObjectInputStream.readObject:()Ljava/lang/Object;
正如我们在以上的字节代码片段中所看到的,除第一种被转换为一个新的函数和一个invokespecial指令以外,其它4种方法都被调用并转换为invokevirtual。
示例
让我们来看看准备创建对象的Employee类:
classEmployeeimplementsCloneable,Serializable{ privatestaticfinallongserialVersionUID=1L; privateStringname; publicEmployee(){ System.out.println("EmployeeConstructorCalled..."); } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } @Override publicinthashCode(){ finalintprime=31; intresult=1; result=prime*result+((name==null)?0:name.hashCode()); returnresult; } @Override publicbooleanequals(Objectobj){ if(this==obj) returntrue; if(obj==null) returnfalse; if(getClass()!=obj.getClass()) returnfalse; Employeeother=(Employee)obj; if(name==null){ if(other.name!=null) returnfalse; }elseif(!name.equals(other.name)) returnfalse; returntrue; } @Override publicStringtoString(){ return"Employee[name="+name+"]"; } @Override publicObjectclone(){ Objectobj=null; try{ obj=super.clone(); }catch(CloneNotSupportedExceptione){ e.printStackTrace(); } returnobj; } }
在下面的Java程序中我们用5种方式来创建Employee对象。
publicclassObjectCreation{ publicstaticvoidmain(String...args)throwsException{ //Byusingnewkeyword Employeeemp1=newEmployee(); emp1.setName("Naresh"); System.out.println(emp1+",hashcode:"+emp1.hashCode()); //ByusingClassclass'snewInstance()method Employeeemp2=(Employee)Class.forName("org.programming.mitra.exercises.Employee") .newInstance(); //Orwecansimplydothis //Employeeemp2=Employee.class.newInstance(); emp2.setName("Rishi"); System.out.println(emp2+",hashcode:"+emp2.hashCode()); //ByusingConstructorclass'snewInstance()method Constructor<Employee>constructor=Employee.class.getConstructor(); Employeeemp3=constructor.newInstance(); emp3.setName("Yogesh"); System.out.println(emp3+",hashcode:"+emp3.hashCode()); //Byusingclone()method Employeeemp4=(Employee)emp3.clone(); emp4.setName("Atul"); System.out.println(emp4+",hashcode:"+emp4.hashCode()); //ByusingDeserialization //Serialization ObjectOutputStreamout=newObjectOutputStream(newFileOutputStream("data.obj")); out.writeObject(emp4); out.close(); //Deserialization ObjectInputStreamin=newObjectInputStream(newFileInputStream("data.obj")); Employeeemp5=(Employee)in.readObject(); in.close(); emp5.setName("Akash"); System.out.println(emp5+",hashcode:"+emp5.hashCode()); } }
此程序输出结果如下:
EmployeeConstructorCalled... Employee[name=Naresh],hashcode:-1968815046 EmployeeConstructorCalled... Employee[name=Rishi],hashcode:78970652 EmployeeConstructorCalled... Employee[name=Yogesh],hashcode:-1641292792 Employee[name=Atul],hashcode:2051657 Employee[name=Akash],hashcode:63313419
以上内容是关于java创建对象的5种不同方法,希望给大家学习java时有所帮助。也谢谢大家对毛票票的支持。