为什么来自超类的“this”调用了子类的方法?

huangapple go评论56阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2020年8月17日 17:56:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/63448525.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定