protected权限的说明中有一个是说:父类的protected方法,子类可以跨包调用
也做了下实验是成功的。
但是没搞懂为什么Object的clone()方法,作为我们写的所有的类都应该是他的子类吧,为什么却不能直接用?还需要重写,把protected改成public的呢?
想了很久。
也做了下实验是成功的。
但是没搞懂为什么Object的clone()方法,作为我们写的所有的类都应该是他的子类吧,为什么却不能直接用?还需要重写,把protected改成public的呢?
想了很久。
简单地说 在A类中进行
JAVA code
new B().clone();是不行的
假设即使A B同包 且B未覆盖clone方法,只能是子类调用受保护的clone方法克隆他自己。如在A类中
JAVA code
this.clone();可以的要想在A中调用B的clone方法,就需要B中重写clone方法,可以定义成public或protected。
一般都不是在X这个类里面调用的,而是在别的类里面调用的吧,所以当然是不能用了。
1)Object 类的 clone 方法执行特定的克隆操作。如果你自己定义的类没有实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。
2)Object 类本身不实现接口 Cloneable,所以在你自己定义的类中为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。
protected native Object clone() throws CloneNotSupportedException;
clone为何称作“Cloneable接口”,Object类没有implements Cloneable呀?
一个类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。 按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。请参阅 Object.clone(),以获得有关重写此方法的详细信息。 注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
我在两个不同的包下写分别写两个类A,B , 并且B继承A, B能直接调用A类中的protected方法。
我就对clone()方法产生了疑惑,子类怎么会不能直接用父类的Object 的protected修饰的clone()方法呢?? protected权限说了子类可以跨包调用父类的方法嘛?
我就对clone()方法产生了疑惑,子类怎么会不能直接用父类的Object 的protected修饰的clone()方法呢?? protected权限说了子类可以跨包调用父类的方法嘛?
答:谁说的.你当然可以直接调用父类Object的clone()方法,这是没有问题的啊.
当你调用父类Object的clone()方法时,该方法中代码会首先检查当然对象的类有没有实现Clonerable接口,若没有,则抛出 CloneNotSupportedException 异常,否则就执行你的代码.
因此:这就是为什么必须要求:在定制你自己的clone()代码时,必须这样写: public Object clone()//定制你自己的clone()代码
{
super.clone();
//这正是调用父类Object的clone()方法,目的:进行检查当然对象,有没有实现Clonerable接口 //然后此处才是你的真正的clone代码
}若你有意违反规则,就是不写上:super.clone();
则:你的clone()方法就没有进行检查,就不会再抛出 CloneNotSupportedException 异常了.
但:这不是一个好做法.因为:super.clone();除了检查之外,还做了其它的事件.
主要是实现Cloneable接口。
谢谢谢谢!!