所谓的权限其实是方法的调用者和方法的提供者之间的关系。
我们知道clone方法是Object对象中的protected权限的方法,该方法在同包,同类,子类中都可以使用。显然A类是Object类的子类。那么,看如下的代码,会报错吗?
public class Test {
public static void main(String[] args) {
A a = new A();
a.clone();
}
}
class A {}
// protected native Object clone() throws CloneNotSupportedException;
实际上会报错! ,但是为什么会报错呢?
因为调用clone()方法的,并不是a对象!

方法的调用者与方法的提供者
在Java中,’.’ 符号表示的只是从属关系,比如下面这段代码中,并不是a修改了age属性,而是Test类在它的main方法中修改了a对象的age属性。
public class Test {
public static void main(String[] args) {
A a = new A();
a.age = 1;
}
}
class A {
public int age = 0;
}
再看第一段代码: 实际上,调用clone方法的是Test类,而这个clone方法是从属于A类的,因此方法的调用者和方法的提供者并不存在父子关系。因此会报错。
public class Test {
public static void main(String[] args) {
A a = new A();
// 方法的调用者 : Test类
// 方法的提供者 : a对象
a.clone();
}
}
class A {}
// protected native Object clone() throws CloneNotSupportedException;
看图更清晰:

本文探讨了Java中方法调用者与方法提供者的关系,解释了为什么即使A类继承自Object类,也不能直接在非同包的Test类中调用A对象的protected clone方法。
399

被折叠的 条评论
为什么被折叠?



