java中存在着不少空接口,如Cloneable和Serializable接口,当类实现了这个接口时,类就变成了接口的实现类,所以可以正常调用方法。因为有些方法调用之前会检查对象是否是对应接口类型的对象,比如clone()方法,当对象不是Cloneable类型时,编译会报错。以下,
Student.java
//后面会调用clone方法,但是这里没有实现Cloneable接口
public class Student {
private int age;
private String name;
private Professor professor;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Professor getProfessor() {
return professor;
}
public void setProfessor(Professor professor) {
this.professor = professor;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", professor=" + professor + "]";
}
public Student(int age, String name, Professor professor) {
super();
this.age = age;
this.name = name;
this.professor = professor;
}
public Student() {
super();
System.out.println("调用Student类的构造方法");
// TODO Auto-generated constructor stub
}
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
Professor.java
public class Professor {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Professor [name=" + name + ", age=" + age + "]";
}
public Professor(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Professor() {
super();
System.out.println("调用了Professor类的构造方法");
// TODO Auto-generated constructor stub
}
}
方法调用类
public class ShadowCopy {
public static void main(String[] args) {
Professor p1 = new Professor();
p1.setName("Professor Zhang");
p1.setAge(30);
Student s1 = new Student();
s1.setName("xiao ming");
s1.setAge(18);
s1.setProfessor(p1);
System.out.println(s1);
try {
Student s2 = (Student) s1.clone(); //调用clone()方法
Professor p2 = s2.getProfessor();
// Professor p3 = new Professor();
// p3.setName("Professor Li");
// p3.setAge(45);
// s2.setProfessor(p3);
p2.setName("Professor Li");
p2.setAge(45);
s2.setProfessor(p2);
System.out.println("复制后的:s1 = " + s1);
System.out.println("复制后的:s2 = " + s2);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
以上代码通过Student对象调用了clone()方法,但是没有实现Cloneable接口,所以会报错
调用了Professor类的构造方法
调用Student类的构造方法
Student [age=18, name=xiao ming, professor=Professor [name=Professor Zhang, age=30]]
java.lang.CloneNotSupportedException: com.briup.day.clone.Student
at java.lang.Object.clone(Native Method)
at com.briup.day.clone.Student.clone(Student.java:42)
at com.briup.day.clone.ShadowCopy.main(ShadowCopy.java:17)
在Student类中实现Cloneable接口就不会报错了。