我知道Doc / Oracle表示子类不会从超类继承私有成员。
但是在调试程序时,如果我们使用ctrl F7和Ctrl F4跟踪变量,则肯定可以看到“继承了私有成员”。真是奇怪。
即使我用空{}
覆盖默认构造函数,它实际上仍然继承私有成员,尽管私有成员不可访问。
术语和实际工作之间相当混乱。
我创建了一个具有三个类的示例:
public class Inheritance {
public static void main(String[] args) {
teacher t1 = new teacher();
t1.setGrd(80);
System.out.println(t1.getGrd());
}
}
public class person {
private int age=90;
public void person(){
}
}
public class teacher extends person {
private int grade;
public void setGrd(int age){
grade=age;
}
public int getGrd(){
return grade;
}
}
跟踪时:
答案 0 :(得分:3)
我认为该文档意味着子类无法查看/访问超类的私有成员。这并不意味着它们仍不存在于超类中。调试器将显示实例的完整状态,其中包括超类的私有状态。
答案 1 :(得分:1)
但是在调试程序时,如果我们使用ctrl F7和Ctrl F4跟踪变量,我们肯定会看到“继承了私有成员”。
不继承-IDE显示类型层次结构的所有 1 字段以帮助调试。它通过诸如遍历所有超类(getSuperclass
)和收集所有字段(getDeclaredFields
)之类的反射来实现。这里没有语言语义在起作用,这是“黑客”。
我不知道您使用的是哪种IDE,但是“继承”标签不是精确的单词选择,尽管可以很好地说明这一点。您可以向维护者提出请求,要求使用更精确的单词。
1 IDE可以为您提供启用/禁用显示内容的选项,例如常量(static final
或static
字段,这些字段也不会被继承。
答案 2 :(得分:0)
不继承私有成员肯定会违反Liskov subistution principle,因此我认为您的做法是错误的。假设一个简单的例子:
public Foo {
private int x = 50;
public void yell() { System.out.println(x); }
}
public Bar extends Foo {
}
Bar bar = new Bar();
bar.yell();
如果没有继承private
字段,应该怎么办?您会发现您的扣除额有误。 private
个成员都是继承的,但无法访问。
这听起来没什么用,但不是因为您可以通过依赖内部状态的超类型方法实现许多功能,而惯性类则不需要内部状态。