2016-01-22 55 views
1
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投给超类和呼叫超载方法

回答

1

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

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

这将按预期调用正确的方法B#met(...)。由于Object与其方法之间的绑定强于存储类型和与之相关的方法之间的绑定,所以对象的方法表不会因为您更改存储在Object中的变量的类型而发生更改它。第二种类型工作,因为输入的类型被铸造为A,因此该方法将其识别为A(输入存储的类型比Object类型具有更强的绑定)。