先附上两端小代码
public class Course {
void put()
{
System.out.println("here");
}
public static void main(String[] args) throws CloneNotSupportedException {
Course a=new Course();
Course b=(Course)a.clone();
a.put();
b.put();
}
}
public class Course implements Cloneable {
void put()
{
System.out.println("here");
}
public static void main(String[] args) throws CloneNotSupportedException {
Course a=new Course();
Course b=(Course)a.clone();
a.put();
b.put();
}
}
其中第一段代码运行会运行错误,而第二段能够正常运行;
这里我感到很迷惑,第一段中调用的clone()应该是Object中已经帮你实现好的clone()方法,而第二段中调用的clone()方法是应该是Clonealbe接口中的方法,那里的clone()应该是未被定义的,按理来说应当报错;
最后结果反而第二段能够正常运行而第一段却报错,十分不解;
希望有人能够为我指点迷津!
同意前一位楼主的说法,具体的解释再补充下:
标记性接口作用和理解
标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。
效果
标记接口在Java语言中有一些很著名的应用,在java 中,RandomAccess和Cloneable 、Serializable一样,都是标志性接口,不需要任何实现,只是又来表明其实现类具体有某种特质的。
功能
标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。
比喻
打个比喻,不是很恰当。就像是一个人穿了件名牌衣服(实现了标识接口),别人一看他穿的衣服(标识接口)就知道他的品味、身份(特性)。
java有一类接口是标记型接口,像序列化用到的Serializable。这类接口不提供属性和方法,只是标记这个接口的实现类采用了某种功能。像Clonable,只有实现了这个接口才会调用clone()方法,没实现的话虚拟机会抛异常。