Java创建对象的几种方法
| 
                         有时候,也可能碰到这样面试题,如: 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,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,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,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();
    }
  }
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
- 如何从Java执行Python脚本?
 - Java使用正则表达式实现找出数字功能示例
 - java – Eclipse – 基于return或get(Shortcut)声明变量
 - java.text.SimpleDateFormat中的奇怪的行为,期望yyyyMMdd给
 - java – 如何在Intellij Idea中找到静态字符串结果连接,而不
 - java中利用List的subList方法实现对List分页(简单易学)
 - java – 如何使用GSON / JSON将字符串数组转换为对象?
 - java – 什么是运行时绑定?
 - 计算不同长度的两个向量之间的距离
 - java 解决异常 2 字节的 UTF-8 序列的字节2 无效的问题
 
