[英]Confused about inheriting methods and fields in Java
我试图对子类如何访问超类的方法和字段进行一些研究。 当我读到一篇关于stackoverflow的文章,解释了继承“真正”如何工作时,我很困惑地看到我的输出。 我读的帖子是: Java继承真正发生了什么?
阅读这篇文章后,这是我对继承的理解,如果有错,我请您纠正:
应用我刚刚写下的逻辑,我遇到了一些奇怪的输出。 在下面的示例中,我有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对象是被表示的类的静态同步方法锁定的对象。
参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.