该网页链接@MadProgrammer给出了一个体面的解释:

“ protected修饰符指定只能在自己的包中访问该成员(与package-private一样),并且只能由其在另一个包中的类的子类访问。”

这意味着受保护的成员必须直接通过其定义的类或该类的子类进行访问,同时也要位于适当的包中。这不一定意味着您可以通过在所述类的子类中创建的所述类的实例来访问受保护的成员。重点是所涉及的软件包。

这是您的示例:

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在package first。

2020-09-16