Java创建对象的几种方法
有时候,也可能碰到这样面试题,如:
Java创建对象有哪几种方法?
除了new之外,java创建对象还有哪几种方式?
本文结合例子,给出几种Java创建对象的方法,Herewego~~~~
使用new创建
这是最常用的一种。如:
Bookbook=newBook();
示例如下:
packagetest;
importjava.io.Serializable;
importjava.util.List;
/**
*@authorwangmengjun
*
*/
publicclassBookimplementsSerializable{
privatestaticfinallongserialVersionUID=-6212470156629515269L;
/**书名*/
privateStringname;
/**作者*/
privateList<String>authors;
/**ISBN*/
privateStringisbn;
/**价格*/
privatefloatprice;
publicBook(){
}
/**
*@paramname
*@paramauthors
*@paramisbn
*@paramprice
*/
publicBook(Stringname,List<String>authors,Stringisbn,floatprice){
this.name=name;
this.authors=authors;
this.isbn=isbn;
this.price=price;
}
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@returntheauthors
*/
publicList<String>getAuthors(){
returnauthors;
}
/**
*@paramauthorstheauthorstoset
*/
publicvoidsetAuthors(List<String>authors){
this.authors=authors;
}
/**
*@returntheisbn
*/
publicStringgetIsbn(){
returnisbn;
}
/**
*@paramisbntheisbntoset
*/
publicvoidsetIsbn(Stringisbn){
this.isbn=isbn;
}
/**
*@returntheprice
*/
publicfloatgetPrice(){
returnprice;
}
/**
*@parampricethepricetoset
*/
publicvoidsetPrice(floatprice){
this.price=price;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Book[name="+name+",authors="+authors+",isbn="+isbn+",price="
+price+"]";
}
}
/**
*1.使用new创建对象
*/
Bookbook1=newBook();
book1.setName("Redis");
book1.setAuthors(Arrays.asList("Eric","John"));
book1.setPrice(59.00f);
book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");
System.out.println(book1);
使用object.clone()
如果要调用clone方法,那么该object需要实现Cloneable接口,并重写clone()方法。
修改后的Book类如下:
packagetest;
importjava.io.Serializable;
importjava.util.List;
/**
*@authorwangmengjun
*
*/
publicclassBookimplementsSerializable,Cloneable{
privatestaticfinallongserialVersionUID=-6212470156629515269L;
/**书名*/
privateStringname;
/**作者*/
privateList<String>authors;
/**ISBN*/
privateStringisbn;
/**价格*/
privatefloatprice;
publicBook(){
}
/**
*@paramname
*@paramauthors
*@paramisbn
*@paramprice
*/
publicBook(Stringname,List<String>authors,Stringisbn,floatprice){
this.name=name;
this.authors=authors;
this.isbn=isbn;
this.price=price;
}
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@returntheauthors
*/
publicList<String>getAuthors(){
returnauthors;
}
/**
*@paramauthorstheauthorstoset
*/
publicvoidsetAuthors(List<String>authors){
this.authors=authors;
}
/**
*@returntheisbn
*/
publicStringgetIsbn(){
returnisbn;
}
/**
*@paramisbntheisbntoset
*/
publicvoidsetIsbn(Stringisbn){
this.isbn=isbn;
}
/**
*@returntheprice
*/
publicfloatgetPrice(){
returnprice;
}
/**
*@parampricethepricetoset
*/
publicvoidsetPrice(floatprice){
this.price=price;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Book[name="+name+",authors="+authors+",isbn="+isbn+",price="
+price+"]";
}
@Override
protectedObjectclone()throwsCloneNotSupportedException{
return(Book)super.clone();
}
}
测试代码
/**
*1.使用new创建对象
*/
Bookbook1=newBook();
book1.setName("Redis");
book1.setAuthors(Arrays.asList("Eric","John"));
book1.setPrice(59.00f);
book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");
System.out.println(book1);
/**
*2.使用clone创建对象
*/
try{
Bookbook2=(Book)book1.clone();
System.out.println(book2);
}catch(CloneNotSupportedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
使用Class.newInstance()
可以直接使用Class.forName("xxx.xx").newInstance()方法或者XXX.class.newInstance()完成。
/**
*3.使用Class.newInstance();
*/
try{
Bookbook3=(Book)Class.forName("test.Book").newInstance();
System.out.println(book3);
book3=Book.class.newInstance();
System.out.println(book3);
}catch(InstantiationException|IllegalAccessException|ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
使用Contructor.newInstance()
可以指定构造器来创建,如选择第一个构造器创建;也可以指定构造函数参数类型来创建。
/**
*4.使用Constructor.newInstance();
*/
try{
//选择第一个构造器创建Book
Bookbook4=(Book)Book.class.getConstructors()[0].newInstance();
//Book[name=null,authors=null,isbn=null,price=0.0]
System.out.println(book4);
/**
*调用指定构造函数创建对象
*/
book4=(Book)Book.class.getConstructor(String.class,List.class,String.class,
float.class).newInstance("NewInstanceExample",Arrays.asList("Wang","Eric"),
"abc1111111-def-33333",60.00f);
//Book[name=NewInstanceExample,authors=[Wang,Eric],isbn=abc1111111-def-33333,price=60.0]
System.out.println(book4);
}catch(InstantiationException|IllegalAccessException|IllegalArgumentException
|InvocationTargetException|SecurityException|NoSuchMethodExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
使用Class.newInstance()或者Contructor.newInstance(),其本质是一样的,都采用了反射机制。
使用反序列化
/**
*5.使用反序列化
*/
try(ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("book.dat"));
ObjectInputStreamois=newObjectInputStream(newFileInputStream("book.dat"));){
oos.writeObject(book1);
Bookbook5=(Book)ois.readObject();
System.out.println(book5);
}catch(IOException|ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
当然了,除了上述几种方式之外,还可以使用JNI等方式来创建对象,这边就不一一列举了。
完整的示例代码如下:
Book.java
packagetest;
importjava.io.Serializable;
importjava.util.List;
/**
*@authorwangmengjun
*
*/
publicclassBookimplementsSerializable,Cloneable{
privatestaticfinallongserialVersionUID=-6212470156629515269L;
/**书名*/
privateStringname;
/**作者*/
privateList<String>authors;
/**ISBN*/
privateStringisbn;
/**价格*/
privatefloatprice;
publicBook(){
}
/**
*@paramname
*@paramauthors
*@paramisbn
*@paramprice
*/
publicBook(Stringname,List<String>authors,Stringisbn,floatprice){
this.name=name;
this.authors=authors;
this.isbn=isbn;
this.price=price;
}
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@returntheauthors
*/
publicList<String>getAuthors(){
returnauthors;
}
/**
*@paramauthorstheauthorstoset
*/
publicvoidsetAuthors(List<String>authors){
this.authors=authors;
}
/**
*@returntheisbn
*/
publicStringgetIsbn(){
returnisbn;
}
/**
*@paramisbntheisbntoset
*/
publicvoidsetIsbn(Stringisbn){
this.isbn=isbn;
}
/**
*@returntheprice
*/
publicfloatgetPrice(){
returnprice;
}
/**
*@parampricethepricetoset
*/
publicvoidsetPrice(floatprice){
this.price=price;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Book[name="+name+",authors="+authors+",isbn="+isbn+",price="
+price+"]";
}
@Override
protectedObjectclone()throwsCloneNotSupportedException{
return(Book)super.clone();
}
}
CreateObjectExample.java
packagetest;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.lang.reflect.InvocationTargetException;
importjava.util.Arrays;
importjava.util.List;
/**
*@authorwangmengjun
*
*/
publicclassCreateObjectExample{
publicstaticvoidmain(String[]args){
/**
*1.使用new创建对象
*/
Bookbook1=newBook();
book1.setName("Redis");
book1.setAuthors(Arrays.asList("Eric","John"));
book1.setPrice(59.00f);
book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234");
System.out.println(book1);
/**
*2.使用clone创建对象
*/
try{
Bookbook2=(Book)book1.clone();
System.out.println(book2);
}catch(CloneNotSupportedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
/**
*3.使用Class.newInstance();
*/
try{
Bookbook3=(Book)Class.forName("test.Book").newInstance();
System.out.println(book3);
book3=Book.class.newInstance();
System.out.println(book3);
}catch(InstantiationException|IllegalAccessException|ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
/**
*4.使用Constructor.newInstance();
*/
try{
//选择第一个构造器创建Book
Bookbook4=(Book)Book.class.getConstructors()[0].newInstance();
//Book[name=null,authors=null,isbn=null,price=0.0]
System.out.println(book4);
/**
*调用指定构造函数创建对象
*/
book4=(Book)Book.class.getConstructor(String.class,List.class,String.class,
float.class).newInstance("NewInstanceExample",Arrays.asList("Wang","Eric"),
"abc1111111-def-33333",60.00f);
//Book[name=NewInstanceExample,authors=[Wang,Eric],isbn=abc1111111-def-33333,price=60.0]
System.out.println(book4);
}catch(InstantiationException|IllegalAccessException|IllegalArgumentException
|InvocationTargetException|SecurityException|NoSuchMethodExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
/**
*5.使用反序列化
*/
try(ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("book.dat"));
ObjectInputStreamois=newObjectInputStream(newFileInputStream("book.dat"));){
oos.writeObject(book1);
Bookbook5=(Book)ois.readObject();
System.out.println(book5);
}catch(IOException|ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。