【问题标题】:Java cast to superclass and call overload methodJava 转换为超类并调用重载方法
【发布时间】:2016-01-22 12:09:13
【问题描述】:
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方法被重载了,所以使用了静态绑定?

【问题讨论】:

    标签: java casting polymorphism overriding overloading


    【解决方案1】:

    这就是多态的工作方式。看看这个例子:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2017-11-04
      相关资源
      最近更新 更多