オブジェクトの割り当てとクローン作成

17995 ワード

オブジェクトの割り当てとクローン作成
オブジェクト付与Date now 2=now;
2つの変数now 2とnowには同じオブジェクトのアドレスが格納され、その変数の操作にかかわらず2つは影響を受けます.now 2とnowは同じオブジェクトであるためです.
2つの変数が互いに影響を及ぼさないようにするには、クローンでのみ実現できます.Javaでのクローンは、深いクローンと浅いクローンに分けられます
クローン操作をサポートする必要がある場合は、CloneableインタフェースObjectクラスにclone()メソッドを提供する必要があります.このメソッドは、仮想マシンによって提供されるローカルメソッドです.
protected native Object clone() throws CloneNotSupportedException; Cloneableインタフェースはシンボルインタフェースに属し、具体的な実現はなく、具体的な実現は実際にObjectクラスで提供されている.
  • カスタムクラスでCloneableインタフェース
  • を実装する必要がある
  • カスタムクラスではcloneメソッドを実装する必要があります.このメソッドは親クラスのcloneメソッドを呼び出すだけでよいので、一般的に浅いクローン
  • の処理を追加する必要はありません.
      import java.util.Date;
        
        public class Main1 {
         
        	public static void main(String[] args) throws Exception {
         
        		Student s1 = new Student();
        		s1.setId(100L);
        		s1.setBirth(new Date()); //    ,    s1  ,    s1              
        		Student s2 = (Student) s1.clone();
        		s2.getBirth().setYear(9000);
        		System.out.println(s2);
        		System.out.println(s1);
        	}
        }
        
        class Student implements Cloneable {
         
        	private Long id;
        	private Date birth;
        
        	public Object clone() throws CloneNotSupportedException {
          //          Object   clone   protected 
        		return super.clone();
        	}
        
        	@Override
        	public String toString() {
         
        		return "Student [id=" + id + ", birth=" + birth + "]";
        	}
        
        	public Long getId() {
         
        		return id;
        	}
        
        	public void setId(Long id) {
         
        		this.id = id;
        	}
        
        	public Date getBirth() {
         
        		return birth;
        	}
        
        	public void setBirth(Date birth) {
         
        		this.birth = birth;
        	}
        }
        
    

    深いクローンは、一般的にオブジェクトフローで実装されます.カスタムクラス要件Serializableインタフェースの実装
     import java.io.ByteArrayInputStream;
        import java.io.ByteArrayOutputStream;
        import java.io.ObjectInputStream;
        import java.io.ObjectOutputStream;
        import java.io.Serializable;
        import java.util.Date;
        
        public class Main1 {
         
        	public static void main(String[] args) throws Exception {
         
        		Student s1 = new Student();
        		s1.setId(100L);
        		s1.setBirth(new Date());
        //   ,    s1  ,    s1                     
        		Student s2 = (Student) s1.deepClone();
        		s2.getBirth().setYear(9000);
        		System.out.println(s2);
        		System.out.println(s1);
        	}
        }
        
        class Student implements Serializable {
         
        	private Long id;
        	private Date birth;
        
        //                    private transient String password;//transient               
        	public Student deepClone() {
         
        		Student res = null;
        		try {
         
        			ByteArrayOutputStream baos = new ByteArrayOutputStream();
        			ObjectOutputStream oos = new ObjectOutputStream(baos);
        			oos.writeObject(this);
        			ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
        			res = (Student) ois.readObject();
        			oos.close();
        			ois.close();
        		} catch (Exception e) {
         
        			e.printStackTrace();
        		}
        		return res;
        	}
        
        	@Override
        	public String toString() {
         
        		return "Student [id=" + id + ", birth=" + birth + "]";
        	}
        
        	public Long getId() {
         
        		return id;
        	}
        
        	public void setId(Long id) {
         
        		this.id = id;
        	}
        
        	public Date getBirth() {
         
        		return birth;
        	}
        
        	public void setBirth(Date birth) {
         
        		this.birth = birth;
        	}
        }