gpt4 book ai didi

Java 强制转换为父类(super class)并调用重载方法

转载 作者:行者123 更新时间:2023-11-30 07:39:05 24 4
gpt4 key购买 nike

abstract class A {

int met(A a) {
return 0;
}

int met(B b) {
return 1;
}

int met(C c) {
return 2;
}
}

class B extends A {

int met(A a) {
return 3;
}

int met(B b) {
return 4;
}

int met(C c) {
return 5;
}
}

class C extends B {
int f() {
return ((A)this).met((A)this);
}
}

public class teste {
public static void main(String args[]) {
C x = new C();
System.out.println(x.f());
}
}

程序将返回 3,而我原本期望返回 0。为什么方法 f 中的第一个转换没有执行任何操作,而第二个则有效?是不是因为A类和B类中met方法被重载,所以使用了静态绑定(bind)?

最佳答案

这就是多态性的工作方式。考虑一下这个例子:

A a = new C();
a.met(a);

这将按预期调用正确的方法B#met(...)。对象的方法表不会仅仅因为您更改存储 Object 的变量类型而改变,因为 Object 与其方法之间的绑定(bind)是比存储类型和与其相关的方法之间的关系强。第二种类型有效,因为输入的类型被转换为 A ,因此该方法将其识别为 A (输入存储的类型比输入存储的类型具有更强的绑定(bind)) 对象类型)。

关于Java 强制转换为父类(super class)并调用重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com