首先看这段代码
public class Test {
public static void main(String[] args) {
int a = 5;
int b = a;
System.out.println(a == b);
Student m = new Student();
Student n = m;
System.out.println(m == n);
}
}
可以发现我们为了clone一个一样类型的变量,使用了赋值语句,那么,java中可以不用 = 就可以创建个一样的对象吗?答案是肯定的。我们可以让这个类实现cloneable这个接口,就可以对对象自身进行复制。这个接口自身并没有方法,只是个声明,当有这个接口是说明这个类可以对自身进行复制。
这是cloneable接口的源码
* @author unascribed
* @see java.lang.CloneNotSupportedException
* @see java.lang.Object#clone()
* @since JDK1.0
*/
public interface Cloneable {
}
那么怎么实现这个接口呢?如下
public class Student implements Cloneable {
private int id;
private String username;
public Student() {
}
public Student(int id, String username) {
this.id = id;
this.username = username;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Object clone(){
try {
//这里方便大家理解
Student s = (Student) super.clone();
return s;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
给大家做个测试
public class Test {
public static void main(String[] args) {
Student a = new Student();
Student b = (Student) a.clone();
System.out.println(a == b);
}
}
输出的结果是false,说明通过clone这个方法我们创建了一个新的对象,但是这并不是真正的clone,我们接着看
public class Test {
public static void main(String[] args) {
Student a = new Student();
Student b = (Student) a.clone();
System.out.println(a == b);
System.out.println(a.getUsername() == b.getUsername());
}
}
输出结果是
false
true
说明clone只是对对象进行了复制,并没有对对象里的对象进行复制,那么要怎么要对对象里的对象进行复制呢?
public class Student implements Cloneable {
private int id;
private String username;
private Student student;
public Student() {
}
public Student(int id, String username) {
this.id = id;
this.username = username;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Object clone(){
try {
Student s = (Student) super.clone();
s.student = (Student) this.student.clone();
return s;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
这样就对对象就行了全部复制。
感想:通过这次对字符串的池有些理解了。现在我认为java是一种对引用进行操作的语言。