Java中的父类和子类可以具有相同的实例变量吗?

时间:2010-08-17 09:27:41

标签: java

考虑这些课程:

class Parent {
 int a;
}

class Child extends Parent {
 int a; // error?
}

aChild的声明是否应该因int a的多个声明而导致编译错误?

4 个答案:

答案 0 :(得分:21)

child.a 阴影(或隐藏parent.a

这是合法的Java,但应该避免。我希望您的IDE可以选择向您发出警告。

但请注意,这只是一个问题,因为您已经向世界公开了变量。如果确保所有变量都是私有的(从方法的实现中分离出方法的API)那么父和子都有相同的字段名称并不重要 - 孩子不会无论如何能够看到父母的字段。如果你将一个方法从孩子移动到父母,这可能会引起混淆,并且它的可读性通常不是很好,但它比隐藏情况更好。

答案 1 :(得分:9)

它被称为阴影,可能会给开发人员带来问题。

在你的情况下:

Child child = new Child();
child.a = 1;
System.out.println(child.a);
System.out.println(((Parent)child).a);

会打印

1
0

答案 2 :(得分:6)

有点像嫁给你的堂兄;合法,但不建议。

它可能导致各种令人困惑的行为,因为子类声明隐藏了父类声明。

答案 3 :(得分:0)

不会出现任何编译错误或运行时错误。

public class Parent {
private String name;
private int age;
}

public class Child extends Parent {
String parent;
public int age;
}

在这里,您将能够从Main类访问child.age ...这是通过为派生类提供公共变量可以获得的唯一好处