Java中受保护的访问修饰符
Posted
技术标签:
【中文标题】Java中受保护的访问修饰符【英文标题】:Protected access modifier in Java 【发布时间】:2013-04-03 01:41:58 【问题描述】:我在理解 java 中受保护的访问修饰符(或其背后的设计)时遇到了一些麻烦。我认为这意味着包访问和通过继承包含抽象成员的类的对象进行访问。
我编写了以下示例代码。我看到如果未注释,注释掉的行会产生编译错误。为什么我可以通过 Second 中的 Second 对象访问 pro 而不能通过 Second 中的 First 对象?
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();
【问题讨论】:
您可以阅读Controlling Access to Members of a Class 了解更多详情 观察力不错。这通常会让很多开发人员感到困惑。看下图,或许有帮助。 @MadProgrammer:谢谢,我已经读过了。我基本上对他们用于受保护修饰符的短语“通过另一个包中的类的子类”感到困惑。如上所示,我可以在 Second 中访问 pro,但只能通过 Second 对象 sec 而不能通过 First 对象 fst。 @BM - 我认为您在父类受保护成员的子类访问中缺少的重要细节是访问必须发生在子类“实现”的上下文中(规范指到身体,同样的区别)。任何类的主要方法不被认为是其实现的一部分,这就是你得到错误的原因。 @Perception。如果我在 Second 中以非静态方法编写相同的语句集,如果我取消注释注释行,我仍然会收到相同的错误。所以这不是错误的根源。 【参考方案1】:java 中的受保护成员
相同的包-(它的行为类似于默认)
它可以在同一个类、它的子类和非子类中访问。(它的行为类似于默认值) 您甚至可以使用父或子引用访问受保护的成员。
外包装-
只有 itz 子类可以访问,这里最重要的一点是使用的引用必须是同一个子类 只有
【讨论】:
【参考方案2】:链接的webpage @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
成员可以从package first
中的First
访问。
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
试图从哪个包访问有问题的成员? 第二
包含所述成员的(子)类或其继承成员的父类是否定义在同一个包中? 不,First
定义在 package first
中,所以 protected
使成员无法从 package second
中的 First
访问。
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
中的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
),因此可以从 package first
中的 Third
访问 protected
成员.
【讨论】:
感谢您的清晰解释。我还发现了这个扩展图,它涵盖了所有案例,其中一些没有包含在上面的链接中。 bmanolov.free.fr/javaprotection.php【参考方案3】:这是显示访问级别的图表。您的代码属于图中 Convertible 中的 R(Reference) 案例。即不允许访问另一个包中的子类中的引用。
【讨论】:
感谢图表。我无法阅读上面的文字。有更清晰的链接吗? 这里是链接:programcreek.com/2009/02/….【参考方案4】:protected 意味着对同一包中的其他类可见。由于 Second 位于不同的包 'second.Second' 中,因此它无法首先访问 .pro()。
如果您在“first”的包名下创建了 Second - 那么它将起作用。
【讨论】:
这并不是所有受保护的方法。这也意味着从子类访问。这就是为什么我可以从 Second 中的 Second 对象访问 pro。 看看 syborg 上面说了什么。 “子类和相同的包”以上是关于Java中受保护的访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章