Heim > Java > javaLernprogramm > Hauptteil

Java创建对象的几种方法

高洛峰
Freigeben: 2016-11-22 12:47:01
Original
1580 Leute haben es durchsucht

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

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 + "]";
    }

}
Nach dem Login kopieren
        /**
         * 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);
Nach dem Login kopieren

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

}
Nach dem Login kopieren
Nach dem Login kopieren

使用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();
        }
Nach dem Login kopieren

使用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();
        }
Nach dem Login kopieren

使用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();
        }
Nach dem Login kopieren

当然了,除了上述几种方式之外,还可以使用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();
    }

}
Nach dem Login kopieren
Nach dem Login kopieren

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

}
Nach dem Login kopieren


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!