Java_創建對象的四種方式

  • new對象實例
  • 反射
  • 對象流序列化
  • clone()
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.*;

public class CreateObject {
    public static void main(String[] args) {
        //1.直接new一個person對象
        Person p1 = new Person("cl", 18, new Clothes("black"));
        //2.反射
        Class<Person> personClass = Person.class;
        Person p2 = null;
        try {
            p2 = personClass.newInstance();
            System.out.println(p2 != null);
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
        //3.對象流序列化

        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("person.p"));
             ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream("person.p"))) {
            objectOutputStream.writeObject(p1);
            Person p3= (Person) objectInputStream.readObject();
            if(p3 != null){
                System.out.println(p3.toString());
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        //4. clone()
        try {
            Person p4= (Person) p1.clone();
            System.out.println(p4.toString());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Person implements Serializable, Cloneable {

    private String name;
    private transient Integer age;
    private Clothes clothes;

    /**
     * deep clone;
     *
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person person = (Person) super.clone();
        person.setClothes((Clothes) person.getClothes().clone());
        return person;
    }
}

@Data
@AllArgsConstructor
class Clothes implements Serializable,Cloneable {
    private String color;

    /**
     * shallow clone;
     *
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章