1.引用类型在内存中的占位
public void Test(){
String str1 = "111";
String str2;
str2 = str1;
System.out.println("str2: " + str2);
str1 = "222";
System.out.println("str2: " + str2);
}
引用类似于指针,如上的程序,输出
str2: 111
str2: 111
是不会改变str2的值的。因为str1,str2都是引用类型,内存中”111”,”222”是两块不同的内存区域,在上述操作中,str2始终指向”111”
所以值没有变。
2.引用类型的数据复制方法
数据复制有两种:
浅复制与深复制
浅复制能够实现基本数据类型的复制,但是对于嵌套的引用类型,依然还是单纯的复制其引用
深复制则是需要在嵌套的引用类型中实现clonenable接口(以clonenable)为例,方能实现嵌套的引用类型复制,所以在引用类型嵌套比较深的时候,使用
clonenable并不是很方便
实现方式有两种:
1.实现clonenable接口,重写clone方法,调用super.clone()通常适用于引用类型嵌套不深的引用类型
@Override
public Object clone() {
Student stu = null;
try{
stu = (Student)super.clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return stu;
}
2.实现serializable接口,通过序列化与反序列化实现深度复制
//Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]
public Outer myclone() {
Outer outer = null;
try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
// 将流序列化成对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
outer = (Outer) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return outer;
}