Sometimes, you may also encounter such interview questions, such as:
What are the ways to create objects in Java?
Besides new, what are the other ways to create objects in Java?
This article combines examples to give several methods of creating objects in Java. Here we go~~~~
Create using new
This is the most commonly used one. For example:
Book book = new Book();
The example is as follows:
package test; import java.io.Serializable; import java.util.List; /** * @author wangmengjun * */ public class Book implements Serializable{ private static final long serialVersionUID = -6212470156629515269L; /**书名*/ private String name; /**作者*/ private List<String> authors; /**ISBN*/ private String isbn; /**价格*/ private float price; public Book() { } /** * @param name * @param authors * @param isbn * @param price */ public Book(String name, List<String> authors, String isbn, float price) { this.name = name; this.authors = authors; this.isbn = isbn; this.price = price; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the authors */ public List<String> getAuthors() { return authors; } /** * @param authors the authors to set */ public void setAuthors(List<String> authors) { this.authors = authors; } /** * @return the isbn */ public String getIsbn() { return isbn; } /** * @param isbn the isbn to set */ public void setIsbn(String isbn) { this.isbn = isbn; } /** * @return the price */ public float getPrice() { return price; } /** * @param price the price to set */ public void setPrice(float price) { this.price = price; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price=" + price + "]"; } }
/** * 1. 使用new创建对象 */ Book book1 = new Book(); book1.setName("Redis"); book1.setAuthors(Arrays.asList("Eric", "John")); book1.setPrice(59.00f); book1.setIsbn("ABBBB-QQ677868686-HSDKHFKHKH-2324234"); System.out.println(book1);
Use object.clone()
If you want to call the clone method, then the object needs to implement the Cloneable interface and override the clone() method .
The modified Book class is as follows:
package test;import java.io.Serializable;import java.util.List;/** * @author wangmengjun * */public class Book implements Serializable, Cloneable { private static final long serialVersionUID = -6212470156629515269L; /**书名*/ private String name; /**作者*/ private List<String> authors; /**ISBN*/ private String isbn; /**价格*/ private float price; public Book() { } /** * @param name * @param authors * @param isbn * @param price */ public Book(String name, List<String> authors, String isbn, float price) { this.name = name; this.authors = authors; this.isbn = isbn; this.price = price; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the authors */ public List<String> getAuthors() { return authors; } /** * @param authors the authors to set */ public void setAuthors(List<String> authors) { this.authors = authors; } /** * @return the isbn */ public String getIsbn() { return isbn; } /** * @param isbn the isbn to set */ public void setIsbn(String isbn) { this.isbn = isbn; } /** * @return the price */ public float getPrice() { return price; } /** * @param price the price to set */ public void setPrice(float price) { this.price = price; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price=" + price + "]"; } @Override protected Object clone() throws CloneNotSupportedException { return (Book) super.clone(); } }
Use Class.newInstance()
You can directly use the Class.forName("xxx.xx").newInstance() method or XXX.class.newInstance() to complete.
/** * 3. 使用Class.newInstance(); */ try { Book book3 = (Book) Class.forName("test.Book").newInstance(); System.out.println(book3); book3 = Book.class.newInstance(); System.out.println(book3); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Using Contructor.newInstance()
you can specify a constructor to create, such as selecting the first constructor to create; you can also specify the constructor parameter type to create.
/** * 4. 使用Constructor.newInstance(); */ try { //选择第一个构造器创建Book Book book4 = (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("New Instance Example", Arrays.asList("Wang", "Eric"), "abc1111111-def-33333", 60.00f); //Book [name=New Instance Example, authors=[Wang, Eric], isbn=abc1111111-def-33333, price=60.0] System.out.println(book4); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException | NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Use Class.newInstance() or Contructor.newInstance(). The essence is the same, both use reflection mechanism.
Use deserialization
/** * 5. 使用反序列化 */ try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("book.dat")); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("book.dat"));) { oos.writeObject(book1); Book book5 = (Book) ois.readObject(); System.out.println(book5); } catch (IOException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Of course, in addition to the above methods, you can also use JNI and other methods to create objects, which will not be listed here.
The complete sample code is as follows:
Book.java
package test;import java.io.Serializable;import java.util.List;/** * @author wangmengjun * */public class Book implements Serializable, Cloneable { private static final long serialVersionUID = -6212470156629515269L; /**书名*/ private String name; /**作者*/ private List<String> authors; /**ISBN*/ private String isbn; /**价格*/ private float price; public Book() { } /** * @param name * @param authors * @param isbn * @param price */ public Book(String name, List<String> authors, String isbn, float price) { this.name = name; this.authors = authors; this.isbn = isbn; this.price = price; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the authors */ public List<String> getAuthors() { return authors; } /** * @param authors the authors to set */ public void setAuthors(List<String> authors) { this.authors = authors; } /** * @return the isbn */ public String getIsbn() { return isbn; } /** * @param isbn the isbn to set */ public void setIsbn(String isbn) { this.isbn = isbn; } /** * @return the price */ public float getPrice() { return price; } /** * @param price the price to set */ public void setPrice(float price) { this.price = price; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Book [name=" + name + ", authors=" + authors + ", isbn=" + isbn + ", price=" + price + "]"; } @Override protected Object clone() throws CloneNotSupportedException { return (Book) super.clone(); } }
CreateObjectExample.java
package test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.InvocationTargetException;import java.util.Arrays;import java.util.List;/** * @author wangmengjun * */public class CreateObjectExample { public static void main(String[] args) { /** * 1. 使用new创建对象 */ Book book1 = new Book(); 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 { Book book2 = (Book) book1.clone(); System.out.println(book2); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } /** * 3. 使用Class.newInstance(); */ try { Book book3 = (Book) Class.forName("test.Book").newInstance(); System.out.println(book3); book3 = Book.class.newInstance(); System.out.println(book3); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } /** * 4. 使用Constructor.newInstance(); */ try { //选择第一个构造器创建Book Book book4 = (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("New Instance Example", Arrays.asList("Wang", "Eric"), "abc1111111-def-33333", 60.00f); //Book [name=New Instance Example, authors=[Wang, Eric], isbn=abc1111111-def-33333, price=60.0] System.out.println(book4); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException | NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } /** * 5. 使用反序列化 */ try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("book.dat")); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("book.dat"));) { oos.writeObject(book1); Book book5 = (Book) ois.readObject(); System.out.println(book5); } catch (IOException | ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }