2015-11-13 47 views
0

我运行一个测试程序,以了解更多有关成员变量的知名度,我创建了以下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; 
    } 
} 

什么是ChildChildClassmMember变量的访问级别?是大众保护

回答

3

这将不同于C残留保护++哪里取决于继承类型(公共,保护或私有),它仍然是相同的。

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

2

ChildChildClassmMemberParentClass继承,能见度不会改变 - 因此它仍然是protected

+0

我在JavaDocs中查了一下,但似乎无法找到任何与之相关的东西。任何证据? –

+0

@JDev - 你可以试试看,并得到你的证明(或相信我:)) –

+1

证明只是因为你扩展了父类,它并没有改变定义的变量。 childchild类就像过去的两个类,它就像写作: –

2

protected,已经从父类继承。

mMember父类为受保护的修饰符声明。 ChildChildClass延伸ChildClass其中延伸父类访问修饰符在ChildClass中未被更改,因此受保护的是ChildChildClass中的访问修饰符,该修饰符已从ParentClass继承。

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

向变量提供限制最多的访问,除非您需要不受限制的访问。

编辑:

通过向mMember重新定义减少访问一旦更改访问修饰符私人更改ChildClass的代码如下

private int mMember; 

,ChildChildClass无法访问mMember这是私人现在。您将收到此错误:The filed ChildClass.mMember is not visible

+0

你能详细说一下吗? –

+0

更新了答案 –

2

问题不明确。您只能在声明点上设置可见性。在使用点你可以看到变量或不是。因此,您不能问“访问变量时的可见性是什么?”但只有“我可以访问变量吗?”。对于您的情况,这意味着:ChildChildClassParentClass的一个(n间接)子女,mMember被宣布为protected,因此它在ChildChildClass内可见。欲了解更多信息,请参阅the Oracle page about Access Modifiers

+0

我明白你的意思了,但我可以清楚地看到它在整个儿童课程中都是可见的,这不是我的问题目标。另外,这个Oracle文档在这种情况下并不能满足我的好奇心。 –

相关问题