首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么一个对象的实例会破坏受保护的逻辑?

为什么一个对象的实例会破坏受保护的逻辑?
EN

Stack Overflow用户
提问于 2019-06-13 04:39:07
回答 2查看 87关注 0票数 0

我试图弄清楚Java中受保护的访问修饰符是如何在包继承之间工作的。

我有两个样例包p1和p2。在p1中,有一个类A1,它有一个名为protectedMember的受保护访问实例变量,还有一个类B1,它只是简单地扩展了A1。

在p2中,我有一个扩展了A1的类A2。显然,在A2中,我可以直接访问其父对象(类A1)的受保护成员,这是没有问题的。

但是,如果我在A2中创建了一个A1实例或其子B1的方法,那么我将无法访问该实例的受保护成员。为什么?与默认不同,受保护的成员可由扩展该类的包类和外部包类访问。

那么,为什么在“多包”继承中,我可以直接访问父级的受保护成员,而不能使用实例。

请不要回答“你必须在家长的包里做”--我明白我必须这样做。

我想知道为什么?

代码语言:javascript
复制
package p2;

import p1.A1;
import p1.B1;

public class A2 extends A1 {
// please note  - multi package inheritance
    public  void test (){

        /*
        with non of the instances below I can reach the protected member in A1
         */
        A1 a1 = new A1();
        B1 b1 = new B1();
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-13 07:09:12

因为这是一条规则。你可以在这里找到更多信息:https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf

票数 0
EN

Stack Overflow用户

发布于 2019-06-13 05:53:28

因为有可能有一个A1 (A1 a1 = new A1())的实例,甚至是扩展它的外部类。

假设你有:

代码语言:javascript
复制
public class B2 {
  public void test() {
    A1 a1 = new A1();
  }
}

显然,访问A1的受保护字段应该会失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56570047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档