关于访问权限的问题

来源:互联网 发布:linux more 中查找 编辑:程序博客网 时间:2024/05/01 22:07

提一个问题,什么叫访问权限?问题看似简单,却很难回答准确,就拿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类不是继承关系,但是是同包类,所以可以访问。

原创粉丝点击