Java的访问控制修饰符

访问控制权限
修饰符同类父子类同包其他包
publictruetruetruetrue
protectedtruetruetruefalse
defaulttruefalsetruefalse
privatetruefalsefalsefalse

上面是比较常见的说法,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方法) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值