【问题标题】:Subclass member variable's visibility to another subclass子类成员变量对另一个子类的可见性
【发布时间】:2016-02-15 10:32:17
【问题描述】:

我正在运行一个测试程序以了解有关成员变量可见性的更多信息,并创建了以下 3 个类:

ParentClass.java

public class ParentClass {
    protected int mMember;
}

ChildClass.java

public class ChildClass extends ParentClass {
    ChildClass() {
        mMember = 10;
    }
}

ChildChildClass.java

public class ChildChildClass extends ChildClass {
    ChildChildClass() {
        mMember = 5;
    }
}

ChildChildClass 的mMember 变量的访问级别是什么?它是public还是protected?

【问题讨论】:

    标签: java inheritance visibility


    【解决方案1】:

    它将保持受保护,这与 C++ 不同,后者根据继承类型(公共、受保护或私有)保持不变。

    C++ 允许这种继承的主要原因是它支持多重继承。但是,Java 不支持它。因此,它只是通过保持超类中的访问级别来简化它。

    【讨论】:

      【解决方案2】:

      ChildChildClass 中的mMember 继承自ParentClass,可见性没有改变 - 因此仍然是protected

      【讨论】:

      • 我在 JavaDocs 中查找了它,但似乎找不到任何相关信息。有什么证据吗?
      • @JDev - 你可以试一试并得到你的证明(或者相信我:))
      • 证明只是因为你扩展了父类,它并没有改变定义的变量。 childchild 类就像前面两个类一样,就像写:
      • protected int mMember; mMember = 10; mMember = 5; 仅仅因为你改变了mMember的值并不意味着它改变了它是什么类型。
      • 可以,包内的任何类和包外的子类都可以访问受保护的变量。您可以在同一个包中创建无限数量的类,即使它不是子类,它仍然可以使用受保护的值。如果您想在包之外访问它,那就是您将创建一个子类并工作的时候。但是,如果您尝试从随机类访问它,它将无法正常工作。这是为了防止不相关的类尝试访问它,但允许子类访问它。
      【解决方案3】:

      是protected,继承自父类。

      mMember 在 ParentClass 中被声明为受保护的修饰符。 ChildChildClass 扩展了 ChildClass,后者扩展了 ParentClass。 ChildClass 中的访问修饰符没有被改变,因此 protected 是 ChildChildClass 中的访问修饰符,它继承自 ParentClass。

      查看oracle 控制变量访问修饰符的文章。

      为变量提供最严格的访问权限,除非您需要不受限制的访问权限。

      编辑:

      通过重新定义对 mMember 的减少访问来更改您的 ChildClass 代码,如下所示

      private int mMember;
      

      一旦将访问修饰符更改为私有,ChildChildClass 就无法访问现在私有的 mMember。您将收到此错误:The filed ChildClass.mMember is not visible

      【讨论】:

      • 你能详细说明一下吗?
      【解决方案4】:

      问题表述不当。您只能在声明点设置可见性。在使用时,您要么看到变量,要么看不到变量。因此,您不能问“我访问变量时的可见性是什么?”但只有“我可以访问变量吗?”。对于您的情况,这意味着:ChildChildClass 是ParentClass 的(n 间接)子级,mMember 被声明为protected,因此它在ChildChildClass 中可见。如需更多信息,请参阅the Oracle page about Access Modifiers。

      【讨论】:

      • 我明白你的意思,但我可以清楚地看到它在整个子类中都是可见的,这不是我的问题目标。此外,这个 Oracle 文档并不能满足我在这种情况下的好奇心。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2010-10-25
      相关资源
      最近更新 更多