为什么私有成员实际上是由子类继承的

时间:2018-07-27 17:28:49

标签: java debugging inheritance ide private

我知道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;
    }
} 

跟踪时:

enter image description here

3 个答案:

答案 0 :(得分:3)

我认为该文档意味着子类无法查看/访问超类的私有成员。这并不意味着它们仍不存在于超类中。调试器将显示实例的完整状态,其中包括超类的私有状态。

答案 1 :(得分:1)

  

但是在调试程序时,如果我们使用ctrl F7和Ctrl F4跟踪变量,我们肯定会看到“继承了私有成员”。

不继承-IDE显示类型层次结构的所有 1 字段以帮助调试。它通过诸如遍历所有超类(getSuperclass)和收集所有字段(getDeclaredFields)之类的反射来实现。这里没有语言语义在起作用,这是“黑客”。

我不知道您使用的是哪种IDE,但是“继承”标签不是精确的单词选择,尽管可以很好地说明这一点。您可以向维护者提出请求,要求使用更精确的单词。

1 IDE可以为您提供启用/禁用显示内容的选项,例如常量(static finalstatic字段,这些字段也不会被继承。

答案 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个成员都是继承的,但无法访问。

这听起来没什么用,但不是因为您可以通过依赖内部状态的超类型方法实现许多功能,而惯性类则不需要内部状态。