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(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。