当子类继承超类时,子类与超类中定义的具有不同可访问性的字段之间的关系是什么,哪个字段由子类拥有,哪些不是。 有人可以解释下面的例子:
class Parent
{
private int partOne = 0;
public int partTwo = 1;
public void tellMe()
{
System.out.println(partOne);
System.out.println(partTwo);
}
}
class Child extends Parent
{
private int partOne = 2;
public int partTwo = 3;
public void main(String[] args)
{
Child child = new Child();
child.tellMe();
}
}
当我在Eclipse中调试它时,我在堆栈中看到变量 child ,我发现Child实例有四个字段,其中两个由其类定义,两个由其父类定义,我非常confused.Did我在创建子实例时创建了一个父实例,IMP,我认为它只进入父类的构造函数,但我无法解释为什么子类不会覆盖这两个字段,或者至少,我认为它应该用 public 可访问性覆盖 partTwo 。请告诉我原因是什么,谢谢。
答案 0 :(得分:4)
为什么子类不会覆盖这两个字段,或者至少,我认为它应该覆盖具有公共可访问性的partTwo
在Java中,数据成员不是多态的。这意味着在您的示例中,Child
类中定义的两个字段与Parent
类中的两个字段完全无关,即使它们碰巧共享其名称。
虽然这是语言所允许的,但做这种性质的事情只是一种混淆的方法(正如你所发现的那样)。
如果您需要多态行为,请创建两个成员函数,getPartOne()
和getPartTwo()
,并根据需要覆盖它们。
答案 1 :(得分:0)
通过在partTwo
类上使用相同名称重新定义Parent
类的字段Child
,您将隐藏对该字段super
的访问权限。实际上你应该从编译器那里收到关于它的警告。
进行以下实验,看看发生了什么:
Child
的构造函数上调用partTwo
(是的,这不是必需的,但它可以帮助使事情变得更清晰)。Child
类中删除Child
变量 - 它仍然会编译,但这次将应用{{1}}的构造函数设置的值(并且警告将消失) 您可能已经看过我发布的关于封装的评论 - 只有私有字段可以防止这种混淆并允许以后更好地维护您的类,因为您可以更改类的字段而不影响继承类(只要访问数据的方法保持不变。)