私はJavaの基本的な側面のいくつかを再考しており、浅いクローニングと深いクローンニングに疑問を抱いています。私はそれらを細かく知っており、内部を知っています。浅いクローニングと深いクローニング
public class Department {
String deptName;
public String getdName() {
return deptName;
}
public void setdName(String dName) {
this.deptName = dName;
}
public Department() {
super();
}
public Department(String dName) {
super();
this.deptName = dName;
}
}
Employeeクラス - -
省クラス - しかし、私はこの単純な運動につまずい
public class Employee implements Cloneable{
int empNo;
String empName;
Department dept;
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
public Employee(int empNo, String empName, Department dept) {
super();
this.empNo = empNo;
this.empName = empName;
this.dept = dept;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
メインクラス -
public class ShalowCopyTest {
public static void main(String args[]) {
Department dept1 = new Department("Development");
Department dept2 = new Department("Testing");
Employee emp1 = new Employee(10, "Peter", dept1);
Employee emp2 = null;
try {
emp2 = (Employee) emp1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(emp1.getDept().getdName());
System.out.println(emp2.getDept().getdName());
System.out.println("Now changing emp1.dept");
//emp1.setDept(dept2); //This is deep cloning - why?
emp1.getDept().setdName("Testing"); //This is shallow cloning
System.out.println(emp1.getDept().getdName());
System.out.println(emp2.getDept().getdName());
}
}
あなたが見ることができ、私が使用している場合は、そのemp1.setDept(dept2)、emp1のdeptを変更してもemp2には影響しません。これは深いクローニングです。しかし、emp1.getDept()。setdName( "Testing")だけでdNameを変更すると、emp2のdNameも変更されます。これは浅いクローンです。なぜこれら2つのラインが違いを生み出していますか?なぜ彼らは同じではありませんか?おかげさまで
ここでは、リンゴとオレンジをIMOと比較しています。どちらの行でも何かがスティックになるはずです。最初のケースでは、部門を更新し、2番目のケースでは名前を更新しました。 –
こんにちは@TimBiegeleisen、ありがとう!問題は、元のdeptの名前を直接変更した場合、元の参照が更新されるということです。その場合、別のコピーを作成せずにそこに変更を加えるだけです。元のものを更新するだけで、emp1とemp2の両方に影響します。しかし、私が部署全体を変更すると、部署の別のコピーを作成してそれをクローンに割り当てています。だから、なぜこの場合、それは別のdept参照を作成していますか?コードのどの部分がそういうことを言っているのですか? setDept()メソッドが表示されたら、this.dept = dept - >は浅いクローニングを意味します! –
new()を使用して新しい部門を作成し、後でそれを変更していません!どちらのコピーコンストラクタもどこにも使用していません。だからすべてが浅いです。しかし、this.dept = deptは新しい参照を作成しており、それは私の質問です。それは意図された行動ですか?ありがとう。 –