除了new之外,java创建对象还有哪几种方式?
大神,求带!
大神,求带! 2017-02-16 09:09:41
0
2
1136

除了new之外,java创建对象还有哪几种方式?

大神,求带!
大神,求带!

reply all(2)
数据分析师

In addition to new, what other ways are there to create objects in Java? -PHP Chinese website Q&A-Besides new, what other ways are there to create objects in Java? -PHP Chinese website Q&A

Let’s take a look and learn.

伊谢尔伦

使用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) {        t
        his.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();
    }
 
}

使用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等方式来创建对象,这边就不一一列举了。


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template