The webpage http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html@MadProgrammer linked 给出了一个不错的解释:
"protected修饰符指定该成员只能被访问
在它自己的包中(与 package-private 一样),此外,通过
另一个包中该类的子类。”
这意味着受保护的成员必须通过定义它的类或该类的子类直接访问,同时也位于适当的包中。这并不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员。重点是涉及的包。
以下是您的示例:
package first; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
尝试从哪个包访问有问题的成员?first
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义?Yes, First
定义于package first
, 所以protected
会员可从First
in package first
.
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
尝试从哪个包访问有问题的成员?second
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义?No, First
定义于package first
, so protected
使该成员无法访问First
in package second
.
package second; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
尝试从哪个包访问有问题的成员?second
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义?Yes, Second
,其定义在package second
,继承该成员First
, 所以protected
会员可从Second
in package second
.
为了清楚起见,更多示例:
package first; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
尝试从哪个包访问有问题的成员?first
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义?Yes, Second
继承该成员First
,其定义在package first
, 所以protected
会员可从Second
in package first
.
package first; // Current package
Third third = new Third(); // from package third and extends Second from package second,
// which extends First from package first
third.pro();
尝试从哪个包访问有问题的成员?first
包含所述成员的(子)类或其继承该成员的父类是否在同一个包中定义?Yes, Third
继承该成员Second
,它继承自First
其中定义了成员 (package first
), 所以protected
会员可从Third
in package first
.