繁体   English   中英

对Java中的继承方法和字段感到困惑

[英]Confused about inheriting methods and fields in Java

我试图对子类如何访问超类的方法和字段进行一些研究。 当我读到一篇关于stackoverflow的文章,解释了继承“真正”如何工作时,我很困惑地看到我的输出。 我读的帖子是: Java继承真正发生了什么?

阅读这篇文章后,这是我对继承的理解,如果有错,我请您纠正:

  • 方法和字段不会复制到子类,而是从超类对象调用,除非在子类中重写了该方法和字段。 我已经确认使用javap命令不会将方法和字段复制到子类中。
  • 在子类中调用方法时,它会在运行时在Subclass对象中查找该方法(可能是覆盖的方法),如果找不到,它将在层次结构中向上查找以在Superclass对象中找到它,然后从超类对象。
  • 因为方法和字段没有复制到Subclass,而是从Superclass对象调用,所以Subclass构造函数调用super();。 隐式地确保有一个Superclass对象可用于从中调用继承的方法。

应用我刚刚写下的逻辑,我遇到了一些奇怪的输出。 在下面的示例中,我有A类( 超类 )和B 子类 )。 我从Main方法接收到B作为输出,但是我期望A作为输出。

A类:

public class A {
    public void getTheClass() {
        System.out.println(getClass().getSimpleName());
    }
}

B级:

public class B extends A {
    public B() {
        getTheClass();
    }

}

主班:

public class Main {
    public static void main(String[] args) {
        B b = new B();
    }
}

我之所以期望A作为输出,是因为(根据前面描述的逻辑)由于类对象(B)没有名为getTheClass()的方法,将从超类对象(A)调用getTheClass()方法。 。 Subclass对象没有此方法,因为根据我的理解,方法和字段不会复制到Subclasses。

如果Subclass没有此方法,它将在层次结构中向上搜索,然后从那里进行调用,在这种情况下,该对象将是Superclass对象(A)。 因此,如果从超类对象(A)调用getTheClass()方法,那么该对象的类不是A类而不是B类吗? 在这种情况下,为什么不输出A而是输出B? 如果我打印出关键字this,则会得到同样令人困惑的结果。

因为当在子类对象中找不到被调用的方法时,它会在层次结构中向上移动,因此子类构造函数将调用super()。 隐式地确保有一个Superclass对象可用于从中调用继承的方法。

构造函数(在子对象和父对象中)将在您创建对象本身时调用,而不是在对象上调用方法时调用(因为您需要完全构造的对象来调用对象上的方法)。

之所以看不到打印的类名称为A是因为getClass()方法返回了对象的运行时类型(即B )。

javadoc开始 ,( 重点是我的

返回此Object运行时类 返回的Class对象是被表示的类的静态同步方法锁定的对象。

参考:

什么是Java中的“运行时类”?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM