2017-07-08 82 views
3

我很确定我不能成为第一个绊倒这个,但我找不到答案。这是作业。Java超载分辨率 - 为什么m(演员,演员)而不是m(匹配,演员表)

class Tier{} 

class Fisch extends Tier{} 

class Vogel extends Tier{} 

class Huhn extends Vogel{} 

class Spatz extends Vogel{} 

class Karpfen extends Fisch{} 

class Super{ 
    public void m(Tier t1, Tier t2){ 
     System.out.println("1"); 
    } 

    public void m(Tier t, Fisch f){ 
     System.out.println("2"); 
    } 

    public void m(Fisch f, Tier t){ 
     System.out.println("5"); 
    } 
} 

class Sub extends Super{ 
    public void m(Tier t1, Fisch t2){ 
     System.out.println("3"); 
    } 

    public void m(Vogel v, Fisch f){ 
     System.out.println("4"); 
    } 
} 


public class TierTest{ 
    public static void main(String[] args) { 
     Tier t1 = new Tier(); 
     Tier t2 = new Vogel(); 
     Fisch f = new Karpfen(); 
     Vogel v1 = new Vogel(); 
     Vogel v2 = new Spatz(); 
     Huhn h = new Huhn(); 
     Karpfen k = new Karpfen(); 

     Super sup1 = new Super(); 
     Super sup2 = new Sub(); 

     sup1.m(h, v2); 
     sup2.m(v1, k); //4 expected, got 3 
     sup1.m(t1, t2); 
     sup1.m(v1, k); 
     sup1.m(v2, f); 
     sup2.m(v1, f); //4 expected, got 3 
    } 
} 

两次都是一个Vogel(鸟)(声明和运行时类型)和某种鱼。为什么m(Tier,Fisch)选择m(Vogel,Fisch)?

第一个参数是完美匹配的。其余这些符合我的直觉。

对不起,如果我太麻木,找不到类似的问题。

有一个愉快的周末, 斯蒂芬

+0

非常感谢! –

回答

3

这里:

Vogel v1 = new Vogel();     
Karpfen k = new Karpfen(); 
... 
Super sup2 = new Sub(); 
... 
sup2.m(v1, k); //4 expected, got 3 

sup2声明与Super类类型。
编译器选择的方法依赖于声明变量的类,而不是运行时实例。
因此,编译器会寻找一个匹配Super类的方法。

Super类,这些是m()潜在方法候选:

public void m(Tier t1, Tier t2){ 
    System.out.println("1"); 
} 

public void m(Tier t, Fisch f){ 
    System.out.println("2"); 
} 

public void m(Fisch f, Tier t){ 
    System.out.println("5"); 
} 

编译器选择其他中最具体的方法为:匹配v1k参数声明类型:

选择此方法:

public void m(Tier t, Fisch f){ 
    System.out.println("2"); 
} 

现在,在运行时,该方法是在运行时对象上调用(多态原则)。
作为该sup2变量是指是Sub运行时类,的Sub重载方法被调用:

public void m(Tier t1, Fisch t2){ 
    System.out.println("3"); 
} 

而对于该第二调用:

sup2.m(v1, f); //4 expected, got 3 

正是同样的道理。