可见范围
权限的含义应该理解为控制范围,要把它理解成一个限制范围的空间,更为准确的说叫做可见范围
访问控制的等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)、和private
private 只有自己本类可以访问,没有任何疑问
public 所有地方都可以访问,没有任何疑问
默认也就是包访问权限,顾名思义,包访问权限,也就是必须同一个包中才可以,即使是子类不在同一个包中也不行的
protected是默认包访问权限的扩展,默认是出了包的范围,就不行了,但是protected给予子类放行,即使是包的外部,当然同一个包中的子类肯定是可以的
示例:
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();
}
}
编译器直接报错
如果非要执行,也是直接报错
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 就是默认的包访问权限扩展了一下, 子类可以访问,不管是不是同一个包