先来随便拿一个Userinfo对象
package com.yanghs.test.clone;
import com.yanghs.common.entity.hbm.UserRole;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Collection;
/**
* @author yanghs
* @Description:
* @date 2018/3/14 21:28
*/
public class Userinfo implements Serializable,Cloneable {
private static final long serialVersionUID = 1L;
private String userid;
private String username;
private String password;
private Roleinfo roleinfo;
/**
* 重写Cloneable的clone方法,调用父类的clone方法实现浅克隆
* 实现深克隆需要再调用类中的属性的克隆方法实现深克隆
* @return
* @throws CloneNotSupportedException
*/
@Override
public Object clone() throws CloneNotSupportedException {
Userinfo o = (Userinfo) super.clone();
/*深度克隆对象属性*/
o.roleinfo = (Roleinfo) roleinfo.clone();
return o;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
然后mian方法 实例化
package com.yanghs.test.clone;
/**
* @author yanghs
* @Description:
* @date 2018/4/11 11:54
*/
public class Test {
public static void main(String[] args) {
/*通过类加载器 ClassLoader 加载Userinfo 类 之后方法区就有这个类的信息*/
Userinfo userinfo = new Userinfo();
userinfo.setUsername("张三");
}
}
1.首先读到 Userinfo 当jvm读到这一句时,首先检查方法区有没有这个class的信息没有的话就加载(ClassLOader)Userinfo.class文件
2. 然后声明变量 userinfo 此时在栈区压栈次变量
3.new Userinfo()在堆以方法区class模板创建 userinfo对象 并且次对象中的放法都在堆区。 userinfo中只存地址,除了八大基本类类变量初始化有初始值为0,Boolean为false,char 为\u0000 。
4.栈区userinfo存放 堆区中的地址。当方法传递这个对象时,传递的是地址 所以java只有值传递没有引用传递。
下面来一张如,形象的介绍了这个过程