关于java中clone的问题

先附上两端小代码


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一样,都是标志性接口,不需要任何实现,只是又来表明其实现类具体有某种特质的。

  • 实现了Cloneable表明可以拷贝
  • 实现Serializable 接口表明被序列化了
  • 实现RandomAccess接口则表明这个类可以随机存取。

功能

标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。

比喻

打个比喻,不是很恰当。就像是一个人穿了件名牌衣服(实现了标识接口),别人一看他穿的衣服(标识接口)就知道他的品味、身份(特性)。

java有一类接口是标记型接口,像序列化用到的Serializable。这类接口不提供属性和方法,只是标记这个接口的实现类采用了某种功能。像Clonable,只有实现了这个接口才会调用clone()方法,没实现的话虚拟机会抛异常。