package com.middle.test;
public class Test {
public static void main(String[] args) {
A a = new A();
a.clone(); // 报错 Error:java: clone() 在 java.lang.Object 中是 protected 访问控制
}
}
class A {}
我们不禁产生一个疑问:对象a
父类Object
不是有clone()
方法的嘛,怎么就没有权限访问了呢?
- 首先,我们查看
Object
中clone()
protected native Object clone() throws CloneNotSupportedException;
用protected修饰,说明该方法只能由同包或者子类访问
- 搞清方法提供者和调用者
方法提供者:java.lang.Object
方法调用者:com.middle.test.Test 不是com.middle.test.A ( 这是关键点)
那么为什么方法调用者是com.middle.test.Test呢?
a.clone()这里的点(.),并不是说a调用了clone()方法。准确理解,应该是从属的关系。
可以这么理解:在Test的main中,创建了a对象,并调用了a.clone()方法。所以,是Test发号司令,这个调用者是Test
- 解释
两个类首先不同包,但是是父子关系的(Test是Object的子类)。那为什么还是访问不了?
Test有自己的一些属性和方法,还有从父类那里继承来的属性和方法
A有自己的一些属性和方法,还有从父类那里继承来的属性和方法
Test访问A的父亲Object里的protected方法。打个比方就好像:
Test去访问A的爸爸的传家宝,A爸爸当然拒绝,宝贵着呢能给你看?
那么如何才能在Test中使用a.clone()
package com.middle.test;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A();
a.clone();
}
}
class A {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
这样的话,就是同包访问。