关于protected关键字,即便是Java初学者也可以说出它的含义:protected修饰的成员能够被子类访问。可是这样理解并不彻底准确,下面考虑它的真正含义。java
Java语言定义的访问级别有private、package、protected、public,从前日后访问权限依次扩大。protected和public成员可能被其余包访问,所以被认为是契约的一部分。其余三种访问都容易理解,而protected与继承有关,所以须要稍微注意。this
考虑以下Java程序,Zu、Fu、Zi分别定义在a、b、c三个包中,且Zu->Fu->Zi。Fu分别访问了来自this、Fu、Zu、Zi的protected成员age。那么下面test哪一个能经过编译,哪一个不能?code
package a; public class Zu { protected int age = 67; }
package b; import a.Zu; import c.Zi; public class Fu extends Zu { private void test1() { System.out.println(this.age); } private void test2(Fu f) { System.out.println(f.age); } private void test3(Zu z) { System.out.println(z.age); } private void test4(Zi z) { System.out.println(z.age); } }
package c; import b.Fu; public class Zi extends Fu { }
准确的讲,一个受保护的成员除了能够被自身以及同一个包的类访问以外,还能够经过对象引用访问,只要知足访问者类型比引用类型“宽”(同一类型或者父类)。对象
根据上述规则,test一、test2访问和被访问者类型都是Fu,所以编译经过。test4访问者是Fu,被访问者是Zi,Fu是Zi的父类,所以编译经过。只有test3中被访问的引用为Zu,不是Fu的子类,所以编译不经过,规则掌握以后就很简单了。继承