1 new 方法 调用构造方法
2.反射 调用构造方法
3.反序列化 不会调用构造方法 (Serializable) Externalizable(手动会调用无参构造方法)
4.克隆 开辟新空间
要求实现cloneable接口(标记接口)不调用构造方法,重写克隆方法(自动生成的即可),会调用构造方法
浅克隆 ,不会克隆类内部其他类对象(String型也是浅拷贝)
深克隆,不会克隆类内部其他类对象,该类也需实现cloneable和重写clone方法
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
Adress adress=new Adress("sd");
Person1 p1=new Person1("chichi",adress);
Person1 p2= (Person1) p1.clone();
System.out.println(p1.getAdress().hashCode());
System.out.println(p2.getAdress().hashCode());
}
}
class Person1 implements Cloneable{
private String name;
private Adress adress;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Adress getAdress() {
return adress;
}
public void setAdress(Adress adress) {
this.adress = adress;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person1 p= (Person1) super.clone();
p.setAdress((Adress) adress.clone());
return p;
}
public Person1(String name, Adress adress) {
this.name = name;
this.adress = adress;
}
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", adress=" + adress +
'}';
}
}
class Adress implements Cloneable{
private String add;
public Adress() {
}
public String getAdd() {
return add;
}
public void setAdd(String add) {
this.add = add;
}
@Override
public String toString() {
return "Adress{" +
"add='" + add + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Adress(String add) {
this.add = add;
}
}
结果:
-1361408640
-1361408640
356573597
1735600054
String型也是浅拷贝