Java中的受保护的访问修饰符

我在理解java中的受保护访问修饰符(或其背后的设计)时遇到了一些麻烦。 我认为这意味着包访问和访问通过inheritance包含抽象成员的类的对象。

我写了以下示例代码。 我看到如果取消注释,注释掉的行会产生编译错误。 为什么我可以通过Second中的Second对象访问pro,但不能通过Second中的First对象访问pro?

package first; public class First { protected void pro(){ System.out.println("Can see protected method"); } } 

 package first; public class InFirst { public static void main(String[] args){ First fst = new First(); fst.pro(); } } 

 package second; import first.First; public class Second extends First { public static void main(String[] args){ First fst = new First(); // fst.pro(); Second sec = new Second(); sec.pro(); } } 

网页 @MadProgrammer链接给出了一个不错的解释:

“protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。”

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

以下是您的示例:

 package first; // Current package First fst = new First(); // from package first and does not extend anything fst.pro(); 

试图从哪个包中访问有问题的成员? 第一

(子)类是否包含所述成员或其父类,它inheritance了该成员,是否在同一个包中定义? 是, Firstpackage first定义,因此可以FirstFirst in package first访问protected成员。

 package second; // Current package First fst = new First(); // from package first and does not extend anything fst.pro(); 

试图从哪个包中访问有问题的成员? 第二

(子)类是否包含所述成员或其父类,它inheritance了该成员,是否在同一个包中定义? 不, Firstpackage first定义,因此protected使得成员无法从package second package first访问。

 package second; // Current package Second sec = new Second(); // from package second and extends First from package first sec.pro(); 

试图从哪个包中访问有问题的成员? 第二

(子)类是否包含所述成员或其父类,它inheritance了该成员,是否在同一个包中定义? 是, Second ,在package second定义,inheritanceFirst的成员,因此protected成员可以从Second package second访问。

更清楚的例子:

 package first; // Current package Second sec = new Second(); // from package second and extends First from package first sec.pro(); 

试图从哪个包中访问有问题的成员? 第一

(子)类是否包含所述成员或其父类,它inheritance了该成员,是否在同一个包中定义? 是, SecondinheritanceFirst的成员, Firstpackage first定义,因此可以从package first Second in中访问protected成员。

 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(); 

试图从哪个包中访问有问题的成员? 第一

(子)类是否包含所述成员或其父类,它inheritance了该成员,是否在同一个包中定义? 是的, Thirdinheritance了Second的成员,它从Firstinheritance了它,其中定义了成员(包括package first ),因此protected成员可以从Third package first访问。

受保护与默认 这是显示访问级别的图表。 您的代码属于图中Convertible中的R(参考)案例。 也就是说,不允许在另一个包中的子类中引用。

java中受保护的成员

相同的包 – (它表现得像默认)

它可以在同一类,它的子类以及非子类中访问。(它的行为类似于默认)您甚至可以使用父或子引用访问受保护的成员。

外包装 –

它只能访问itz子类,这里最重要的一点是所使用的引用必须只是同一个子类

protected表示可以访问同一包中的其他类。 因为Second在另一个包’second.Second’中,所以它首先不能访问.pro()。

如果你在’first’的包名下创建了Second,那么它就可以了。