2016-02-05 156 views
1

它爲什麼打印整數? 在編譯時,方法調用綁定到類A的方法。 我希望在B中我不是壓倒一切的。創建其他方法意味着方法重載不同的類。 但運行時發生了什麼?它爲什麼打印整數

class A{ 

void method(Integer i) 
{ 
    System.out.println("Integer"); 

} 
} 
class B extends A 
{ 

void method(int i) 
{ 
    System.out.println("Int"); 
} 
} 
public class Puzzle{ 
    public static void main(String ar[]){ 
     A a = new B(); 
     a.method(20); 
    } 
} 
+3

'方法(int i)'不是'方法(整數i)'的重寫。這是一個過載。 A'方法'被調用是正常的。 –

+0

方法不具有相同的簽名,因此它不覆蓋它是重載的,因此它直接取int而不是Integer。 – Musaddique

回答

3

B具有兩個不同的方法稱爲method:一個由A聲明,這是method(Integer),另一種是B,即method(int)

由於您的可變aA類型的,以a.method()呼叫必須指的是由A類,這是method(Integer)提供了一種方法。

1

您的方法不共享相同的簽名。 void method(int i)不等於void method(Integer i) - 第一個使用原始類型。第二個使用Object Integer。

如果在變化的方法,以方法(int i)以可以再的Aoverride the method,所以in your subclass

@Override 
void method(int i) 
{ 
    System.out.println("Int"); 
} 
1

B不覆蓋名爲「method」的方法,因爲它與A(Integer)中的方法的參數類型不同。

int是一個原始類型,而Integer是一個類。

B法應該是:

@Override 
void method(Integer i) 
{ 
    System.out.println("Int"); 
} 

註釋@Override在這裏告訴類應該覆蓋的方法。這是一個很好的做法,但沒有必要(我會沒有它的工作)。如果你把它放在你當前的代碼中,你會有一個錯誤,因爲方法不會覆蓋任何方法。

我希望它能幫助你。

+0

如果這是他想要的;-) – Rainer

+0

不正確,因爲如果你打算這樣做,你錯過了一件非常重要的事情,我給了-1,但是我願意刪除,如果這是添加。 – Popeye

+0

我添加了重寫註釋,但我不認爲是這樣。我現在很好奇。你什麼意思 ?我忘了什麼? –

0

這正是@Override註釋的作用 - 當您認爲自己重寫並且編譯器會告訴您,如果您錯誤地認爲如此,請添加@Override

如果添加@OverrideBmethod(int i),編譯器就會給你一個錯誤,告訴你,你其實不是覆蓋它,因爲這兩個簽名不同 - 即該方法有不同的參數類型,這不是一個超父級的參數類型。

0

A方法和B方法的簽名是不一樣的。 A中的方法將對象整數(Integer)作爲參數,而B中的方法將基本整數(int)作爲參數。那麼,你是不是真的覆蓋A的方法B.要做到這一點,改變方法B的簽名是這樣的A的

class A{ 

    void method(Integer i){ 
     System.out.println("Integer"); 
    } 

} 

class B extends A{ 

    @Override 
    void method(Integer i){ 
     System.out.println("Int"); 
    } 

} 

public class Puzzle{ 
    public static void main(String[] args){ 
     A a = new B(); 
     a.method(20); 
    } 
} 
0

您的參考是A類型的 - 它不能識別方法儘管可能存在於運行時,但在編譯時以B類型聲明。然後將int文字20自動裝箱到java.lang.Integer,並且調用method(Integer)

如果您要將參考文獻聲明爲B,那麼method(int)將更適合您的論點,並且會被調用。