链接的网页@MadProgrammer 给出了一个不错的解释:
“受保护的修饰符指定该成员只能在其自己的包中访问(与包私有一样),此外,它的类在另一个包中的子类也可以访问。”
这意味着必须通过定义它的类或该类的子类直接访问受保护的成员,同时也必须位于适当的包中。这并不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员。重点是所涉及的软件包。
以下是您的示例:
package first; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个包访问有问题的成员?第一的
包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,First
在 中定义package first
,因此可以从中protected
访问该成员。First
package first
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个包访问有问题的成员?第二
包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?不,First
在 中定义package first
,因此protected
使成员无法从First
中访问package second
。
package second; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
试图从哪个包访问有问题的成员?第二
包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,Second
在 中定义的package second
,从 中继承成员First
,因此protected
可以从Second
中访问该成员package second
。
为了清楚起见,更多示例:
package first; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
试图从哪个包访问有问题的成员?第一的
包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,Second
继承了在First
中定义package first
的成员,因此protected
可以从Second
中访问该成员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();
试图从哪个包访问有问题的成员?第一的
包含所述成员的(子)类或其继承成员的父类是否在同一个包中定义?是的,Third
从 继承成员Second
,它从First
定义成员的位置(package first
)继承它,因此protected
可以从Third
in访问该成员package first
。