再谈包访问权限 子类为何不能使用父类protected方法

可见范围


image

权限的含义应该理解为控制范围,要把它理解成一个限制范围的空间,更为准确的说叫做可见范围

访问控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)、和private


private 只有自己本类可以访问,没有任何疑问

public 所有地方都可以访问,没有任何疑问

默认也就是包访问权限,顾名思义,包访问权限,也就是必须同一个包中才可以,即使是子类不在同一个包中也不行的

protected是默认包访问权限的扩展,默认是出了包的范围,就不行了,但是protected给予子类放行,即使是包的外部,当然同一个包中的子类肯定是可以的


示例:

image

package test.b;

import test.a.Super;

public class SubClass extends Super{

    public static void main(String[] args) {

        SubClass subClass = new SubClass();
         subClass.publicFun();
         subClass.protectedFun();

    }

}


打印信息:

publicFun
protectedFun

子类位于不同的包中,可以访问公有方法,可以访问protected方法 不能访问默认的包访问权限以及私有的


额外的例子:

package test.b;

import test.a.Super;

public class SubClass extends Super {

    public static void main(String[] args) {

        Super superClass = new Super();
         superClass.publicFun();

        superClass.protectedFun();

    }

}

编译器直接报错

image

如果非要执行,也是直接报错

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
     The method protectedFun() from the type Super is not visible

    at test.b.SubClass.main(SubClass.java:12)

相信也有不少人人把上面这种形式的代码理解为:子类中访问父类的protected方法

并且觉得很奇怪,并且认为  子类不同包中并不能访问父类的protected方法

其实这是概念错了

虽然是在子类中,但是却是使用父类的对象,调用父类的protected方法

这是在不同包中,访问protected方法 当然是错误的  

protected的含义是指子类可以访问,说的是子类直接访问父类的protected方法,而不是说子类中,可以调用父类的对象访问protected方法

子类可以访问,可以在子类访问不是一个概念

你可以访问和在你家访问显然差别很大



总结:

public 什么都不用管,谁都可以用

private  只有自己本类可以用,本类自然限定到某个Class定义范围,哪怕你定义类或者子类在同一个文件中,都是白扯

默认的包访问权限 同一个包中,不管其他条件,管你是不是子类都没关系的,不要自己去混淆

protected 就是默认的包访问权限扩展了一下,  子类可以访问,不管是不是同一个包

猜你喜欢

转载自www.cnblogs.com/noteless/p/9270015.html