英文:
Why is "this" from superclass calling method from subclass?
问题
以下是翻译好的内容:
我在使用以下继承和JDK 14时遇到了这个问题:
interface A {
default void a() {
System.out.println("默认 a");
}
default void b() {
System.out.println("默认 b");
}
}
class AImp implements A {
@Override
public void a() {
System.out.println("来自 AImp 的 a");
}
@Override
public void b() {
System.out.println("来自 AImp 的 b");
this.a();
}
}
class B extends AImp {
@Override
public void a() {
System.out.println("来自 B 的 a");
}
@Override
public void b() {
System.out.println("来自 B 的 b");
super.b();
}
}
当我运行:
B b = new B();
b.b();
控制台输出:
来自 B 的 b
来自 AImp 的 b
来自 B 的 a
为什么 AImp
中的关键字 this
引用了 B
类的实例?
我是否对某些内容感到困惑?
感谢您花时间解答。
英文:
I'm running over this problem while working with the following inheritance and JDK 14
interface A {
default void a() {
System.out.println("default a");
}
default void b() {
System.out.println("default b");
}
}
class AImp implements A {
@Override
public void a() {
System.out.println("a from AImp");
}
@Override
public void b() {
System.out.println("b from AImp");
this.a();
}
}
class B extends AImp {
@Override
public void a() {
System.out.println("a from B");
}
@Override
public void b() {
System.out.println("b from B");
super.b();
}
}
when I run
B b = new B();
b.b();
console gives
b from B
b from AImp
a from B
How come the keyword this
in the AImp
is referencing the instance of class B?
Am I being confused with something here?
Thank you for spending time.
答案1
得分: 5
你已经创建了一个 B
的实例,它的动态类型决定了始终调用在 B 中声明的方法,因为它从 A 中进行了覆盖。
无论你从哪里调用方法都无关紧要,重要的是动态类型是什么。
使用 super.method()
是不同的,它明确地向上查找继承。
注意:构造函数永远不会被覆盖。因此,调用 this(params)
不会委托给子类。
英文:
You have created an instance of B
, it is it's dynamic type and due to dynamic binding always the method declared in B is called, because it overrides from A.
It does not matter from where you call the method, but it matters, what is the dynamic type.
With super.method()
it is different, it explicitly goes up in the inheritance.
Note: constructors are not overriden, ever. So calling this(params)
will not delegate to subclass.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论