首页 > 编程 > Java > 正文

Java创建对象的几种方法

2019-11-26 13:26:28
字体:
来源:转载
供稿:网友

有时候,也可能碰到这样面试题,如:

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();    }  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表