java中没有C/C++的指针,给程序员带来很多方便,但是这不意味着java没有指针,实质上每一次new语句返回的都是一个指针的引用。很多时候,我们往往忽略对象和引用的区别
例如:
class obj2{
private int a =0;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void changeA(int b){
this.a=b;
}
}
public class JavaCloneEq {
public static void main(String[] args) {
obj2 a = new obj2();
obj2 b = a;
b.changeA(2);
System.out.println("a :" + a.getA());
System.out.println("b :"+ b.getA());
}
}
结果:
a :2
b :2
对b的修改已经影响到a,因为b是对a的引用,而不是一个全新的复制,所以这个时候就需要引入clone来完成。
class obj2 implements Cloneable{ //实现接口
private int a =0;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void changeA(int b){
this.a=b;
}
//重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
public class JavaCloneEq {
public static void main(String[] args) {
obj2 a = new obj2();
obj2 b = null;
try {
b = (obj2) a.clone(); //克隆a
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
b.changeA(5); //改变b对象中的值
System.out.println("a :" + a.getA());
System.out.println("b :"+ b.getA());
}
}
结果:
a :0
b :5
使用clone()方法的步骤:
1.实现clone的类首先需要实现Cloneable接口。Cloneable接口实质上是一个标识接口
2.在类中重写Object类中的clone方法
3.在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone会直接或间接调用java.lang.Object类的clone()方法。
4.把浅复制的引用指向原型对象新的克隆体。
PS:
java在处理基本数据类型(例如int,double,char等),都采用按值传递(传递的是输入参数的复制),除此之外的其他类型都采用按引用传递(传递的是对象的一个引用)。对象除了在函数调用时是引用传递,在使用“=”赋值时也采用引用传递。