《Java基礎知識》 Java創建對象的5種方法

前言

學習的過程,遇到很多情況需要通過非“new”的方式創建對象。

第一種(new)

public class Test {

    @Override
    public String toString() {
        return "===== Test =====";
    }
}
public class TestDemo {

    public static void main(String[] args) {
        Test test = new Test();   // 創建對象
        test.toString();
    }
}

第二種(class.newInstance)

public class TestDemo {

    public static void main(String[] args) {
        Test test = null;
        try {
            test = (Test) Class.forName("demo.knowledgepoints.createobject.Test").newInstance();  // 創建對象
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(test.toString());
    }
}

第三種(Constructor.newInstance)

public class Test {

    public Test(String str){
        System.out.println(str);
    }

    @Override
    public String toString() {
        return "===== Test =====";
    }
}
public class TestDemo {

    public static void main(String[] args) {
        try {
            Constructor<Test> constructor = Test.class.getConstructor(String.class);
            Test test = constructor.newInstance("通過構造有參構造函數創建對象");
            System.out.println(test.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結果:

第四種(clone)

需要實現Cloneable接口

public class Test implements Cloneable {

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "===== Test =====";
    }
}
public class TestDemo {

    public static void main(String[] args) {
        Test test = new Test();
        try {
            Test test1 = (Test)test.clone();
            System.out.println(test1.toString());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

    }
}

運行結果:

第五種(反序列化)

public class Test implements Serializable {

    private static final long serialVersionUID = 1L;

    @Override
    public String toString() {
        return "===== Test =====";
    }
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class TestDemo {

    public static void main(String[] args) {
        try {
            Test test = new Test();
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("demo.knowledgepoints.createobject.obj"));
            out.writeObject(test);
            out.close();

            ObjectInputStream in = new ObjectInputStream(new FileInputStream("demo.knowledgepoints.createobject.obj"));
            Test test1 = (Test) in.readObject();
            System.out.println(test1.toString());
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結果:

序列化和反序列化詳情參考:https://www.cnblogs.com/jssj/p/11766027.html

總結

不同的創建對象有不同的應用場景,瞭解這些場景對閱讀源碼很有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章