有時候,也可能碰到這樣面試題,如:
Java創建對象有哪幾種方法?
除了new之外,java創建對象還有哪幾種方式?
本文結合例子,給出幾種Java創建對象的方法,Here we go~~~~
使用new創建
這是最常用的一種。如:
Book book = new Book();
示例如下:
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);使用object.clone()
如果要調用clone方法,那么該object需要實現Cloneable接口,并重寫clone()方法。
修改后的Book類如下:
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();  }}測試代碼
    /**     * 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();    }使用Class.newInstance()
可以直接使用Class.forName("xxx.xx").newInstance()方法或者XXX.class.newInstance()完成。
    /**     * 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();    }使用Contructor.newInstance()
可以指定構造器來創建,如選擇第一個構造器創建;也可以指定構造函數參數類型來創建。
    /**     * 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();    }使用Class.newInstance()或者Contructor.newInstance(),其本質是一樣的,都采用了反射機制。
使用反序列化
    /**     * 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();    } 當然了,除了上述幾種方式之外,還可以使用JNI等方式來創建對象,這邊就不一一列舉了。
完整的示例代碼如下:
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();    }  }}以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答