提一个问题,什么叫访问权限?问题看似简单,却很难回答准确,就拿protected关键字做例子说明一下:
首先,在com.zp.test包下面定义一个父亲类:
package com.zp.test;
public class Father {
public void eat(){
System.out.println("在吃饭");
}
protected void smoke() {
System.out.println("在吸烟");
}
}
再定义一个儿子类,和父亲类在同一个包下,而且继承父亲类:
package com.zp.test;
public class Son extends Father {
}
我们可以知道,除了父类中的私有方法、私有属性和构造方法,其他的方法和属性子类是都可以继承的,再定义一个测试类,和父亲类跟儿子类在同一个包下:
package com.zp.test;
public class Test {
public static void main(String[] args) {
Son s = new Son();
s.eat();
s.smoke();
}
}
我们可以知道,这个测试类运行是没有问题的,eat方法和smoke方法都可以访问,现在做一点改变,把测试类移动到com.zp包下面,程序还能正常运行吗?
package com.zp;
import com.zp.test.Son;
public class Test {
public static void main(String[] args) {
Son s = new Son();
s.eat();
//s.smoke();
}
}
问题出现了,eat方法可以访问,但是smoke方法是访问不了的。有人要说了,Son是Father的子类,可以调用Father中的非私有属性和方法,为什么在上一个测试类中可以访
问,在这个测试类中就访问不了呢,其实我们要说一下,类的访问权限的定义。类的访问权限指的是,方法(属性)的提供者和调用地点的关系。不光是和调用者有关系,和
调用地点也有关系。在例子中我们可以看到,都是Son的引用去调用Father类中的方法,一次是在同包中调用,可以;而另一次是在不同包中调用,就不可以了。这也间接地
解释了protected关键字的权限范围,本类,同包类,非同包子类,这个范围指的是有protected关键字修饰的方法或属性的调用地点的范围,第二个测试类中,该测试类与
Father类既不是同包关系,也不是非同包子类关系,所以就不能访问了。而第一个测试类虽然和Father类不是继承关系,但是是同包类,所以可以访问。