修饰符 | 同类 | 父子类 | 同包 | 其他包 |
---|---|---|---|---|
public | true | true | true | true |
protected | true | true | true | false |
default | true | false | true | false |
private | true | false | false | false |
上面是比较常见的说法,public default private 都挺好理解的
protected使用时会有点难以理解
package p1;
public class Father1 {
protected void f() {} // 父类Father1中的protected方法
}
package p1;
public class Son1 extends Father1 {}
package p11;
public class Son11 extends Father1{}
package p1;
public class Test1 {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.f(); // Compile OK ----(1)
son1.clone(); // Compile Error ----(2) ---因为clone()是在Java.lang 不和在p1包 它只在其子类和包内可以调用
Son11 son = new Son11();
son11.f(); // Compile OK ----(3)
son11.clone(); // Compile Error ----(4)---因为clone()是在Java.lang 不和在p2包 它只在其子类和包内可以调用
Test1 test=new Test1();
test.clone(); // Compile OK ----(5)---因为test.clone()调用的自己从object类继承来的
}
}
上面代码会有点让人疑惑,Test1类不也是继承Object 类了吗?那它不应该是可以调用clone()方法吗?为什么(2) 不行
如果有这个疑问的话说明你可调用和调用范围理解有点偏差
想要确定可不可调用首先要确定的是,调用的这个方法来自哪里?调用范围什么?调用点属于这个范围吗?比如(2)中是Son1从Object那里继承过来的,Object类属于java.lang包 根据protected方位控制权限可以知道(2) 是可以在Object类内 java.lang包内以及 Object 的子类可以调用,而(2)现在是在Test1内调用超出调用范围了。(注意这个子类调用的概念是说在子类才可以调用所属父类的protected方法,不是说 子类可以new 另一个子类然后调用该子类所属父类的protected方法)