Java转换为超类并调用重载方法

时间:2016-01-22 12:09:13

标签: java casting polymorphism override overloading

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方法是重载的,因此使用静态绑定?

1 个答案:

答案 0 :(得分:1)

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

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

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