【发布时间】:2010-08-17 09:27:41
【问题描述】:
考虑这些类:
class Parent {
int a;
}
class Child extends Parent {
int a; // error?
}
Child中的a的声明是否应该由于int a的多个声明而导致编译错误?
【问题讨论】:
标签: java
考虑这些类:
class Parent {
int a;
}
class Child extends Parent {
int a; // error?
}
Child中的a的声明是否应该由于int a的多个声明而导致编译错误?
【问题讨论】:
标签: java
child.a 阴影(或隐藏)parent.a.
这是合法的 Java,但应该避免。我希望您的 IDE 可以选择对此发出警告。
但是请注意,这只是一个问题,因为您已经向世界公开了一个变量。如果您确保所有变量一开始都是私有的(将方法的 API 与字段的实现分开),那么父母和孩子是否具有相同的字段名称并不重要 - 孩子不会无论如何都能看到父母的字段。如果将方法从子级移到父级,可能会引起混乱,并且通常不会很好地提高可读性,但比隐藏的情况要好。
【讨论】:
这称为阴影,可能会给开发人员带来问题。
在你的情况下:
Child child = new Child();
child.a = 1;
System.out.println(child.a);
System.out.println(((Parent)child).a);
会打印
1
0
【讨论】:
这有点像嫁给你的表弟;合法,但不建议。
它可能导致各种令人困惑的行为,因为子类声明隐藏了父类声明。
【讨论】:
不会有任何编译错误或运行时错误。
public class Parent {
private String name;
private int age;
}
public class Child extends Parent {
String parent;
public int age;
}
在这里,您将能够从 Main 类访问 child.age ...这是通过派生类的公共变量获得的唯一好处
【讨论】: