搜尋

首頁  >  問答  >  主體

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

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

大神,求带!大神,求带!2831 天前1110

全部回覆(2)我來回復

  • 数据分析师

    数据分析师2017-10-01 00:20:28

    除了new之外,java建立物件還有哪幾種方式? -PHP中文網路問答-除了new之外,java創建物件還有哪幾種方式? -PHP中文網問答

    圍觀一下哦,學習一下。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-02-16 09:16:14

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


    回覆
    0
  • 取消回覆