2014-06-21 56 views
1
public class NullDemo { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    NullDemo n = new NullDemo(); 
    n.execute(null); 

} 

public void execute(Object o) { 
    System.out.println("object"); 
} 

public void execute(Double o) { 
    System.out.println("double"); 
} 
} 

我已執行此上面的代碼並執行與執行(雙O)的方法。我需要知道它之所以執行執行(雙O),而不是執行(對象o)哪個重載方法會執行,爲什麼?

,並假設

public class NullDemo { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    NullDemo n = new NullDemo(); 
    n.method1(null); /// give the compilation error 

} 

public void method1(Float o) { 
    System.out.println("object"); 
} 

public void method1(Double o) { 
    System.out.println("double"); 
} 
} 

,如果我做的方法public void方法1(浮O)和公共無效方法1(雙O)爲什麼會是這樣,它會給編譯錯誤?這與層次結構有關嗎?

+0

我認爲編譯錯誤的發佈是因爲它很難區分double和float - 所以它對於選擇哪個函數是不明確的。 – mdebeus

+2

你可以在這裏找到答案: http://stackoverflow.com/questions/19243708/how-do-overloaded-methods-work/19243758#19243758 –

+1

現在我意識到它沒有Java作爲原始標記。悲傷的時刻。 – Makoto

回答

1

Java將傾向於調用繼承樹最遠的方法。考慮以下情況:

class Demo { 

    public void doSomething(ParentClass foo) { 
     //..... 
    } 

    public void doSomething(ChildClass foo) { 
     //..... 
    } 

    public static void main() { 
     Demo demo = new Demo(); 
     demo.doSomething(new ChildClass()); 
    }  
} 

在上述情況下,方法調用可以匹配兩種方法中的任何一種。但是,你可以直觀地看到它應該匹配第二種方法。

你可以閱讀有關在Java規範的具體行爲: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2

0

鑑於你的初始代碼,添加強制轉換爲(Object)將打印你所期望的。這是因爲Doublemore specific然後Object,並因此被默認調用,

public static void main(String[] args) { 
    NullDemo n = new NullDemo(); 
    n.execute((Object) null); 
} 

public void execute(Object o) { 
    System.out.println("object"); 
} 

public void execute(Double o) { 
    System.out.println("double"); 
} 
0

如果兩種以上的方法可以適用於一個方法調用,編譯器會選擇其中一個更具體的,如果可能的話。在第一個示例中,方法execute(Double o)更具體,因爲DoubleObject的子類。在第二個例子中,兩種方法都不是更具體,因爲DoubleFloat都不是另一個的子類。由於這兩種方法都可以應用(null可以作爲DoubleFloat),並且兩者都不是更具體,因此編譯器會報告該調用不明確。

相關問題