2017-07-08 50 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 

正是同樣的道理。