2013-07-16 19 views
21

Po prostu z ciekawości spróbowałem tego przykładu.JAVA Przeciążenie obiektu/łańcucha znaków

public class Class1 { 

    public void method(Object obj){ 
     System.out.println("Object"); 
    } 

    public void method(String str){ 
     System.out.println("String"); 
    } 

    public static void main(String... arg){ 
     new Class1().method(null); 
    } 

} 

Wyjście to "Ciąg". Chciałbym wiedzieć, na jakiej podstawie JVM decyduje się na wywołanie metody biorąc String jako argument, a nie Object.

+0

Czy to nie jest błąd kompilacji? Coś o niejednoznacznych parametrach? – Thilo

+0

Najwyraźniej nie. Chciałbym, żeby tak było. – Thilo

+0

Nic dwuznacznego na ten temat, @Thilo. Byłoby niejednoznaczne, gdyby pierwsza metoda zaakceptowała "Integer" i drugi "String", ponieważ wtedy żaden z nich nie byłby "bardziej konkretny" niż drugi. – Joni

Odpowiedz

14

Gdy więcej niż jeden przeciążone metody mogą być stosowane do listy argumentów, jest wykorzystywana w sposób najbardziej szczegółowy sposób.

W tym przypadku jedna z metod może zostać wywołana po przejściu null, ponieważ "typ zerowy" można przypisać zarówno do Object, jak i do String. Metoda, która zajmuje String jest bardziej szczegółowa, więc zostanie wybrana.

+0

Jak mogę zadzwonić do najmniej określonej metody? –

+0

Użyj rzutowania typu. Na przykład 'method ((Object) null)' – Joni

+0

używam tego na razie. ale powiedzmy, że używam tej metody jako odsłoniętej metody biblioteki. więc nie chcę, aby użytkownik wykonał wszystkie tego typu castingi wszystkie. użytkownik po prostu przekaże wartość i muszę programowo przekierować kontrolę do odpowiedniej metody. czy jest jakiś inny sposób? @joni –

10

Ilekroć tam Metoda przeciążenia, JVM będzie szukać sposobu z najbardziej określonego typu do najmniejszego konkretnego typu

+2

Sugeruję, że edycja twojego cytatu z 'najbliżej' do' najbardziej konkretnego typu 'byłaby bardziej odpowiednia pod względem programowania języka. – exexzian

+0

Dokonano korekty. Dziękuję za to. Miałem na myśli to samo, jednak twoje słowa mają więcej sensu. – Reddy

+3

To jest kompilator, który decyduje, która metoda powinna zostać wywołana, a nie JVM. – Joni

0

becaue jesteś przejazdem NULL w wywołanie metody i zdefiniowane pustkę method (String str) I String zawsze initlize z wartością null. znajdzie pasującą, sparametryzowaną metodę. To jest "str" ​​na konsoli.

2

Kompilator Java wybiera najbardziej szczegółową metodę.

String jest bardziej specyficzny typ stosunku do Object.

0

Podczas wykonywania metody przeciążania jvm próbuje przejść do następnej w hierarchii. Dla np. jeśli przeładujesz metody długimi i int, ale wywołasz metodę przekazując bajt, najpierw przejdzie ona do int, ponieważ jest następna w hierarchii do bajtu.

0

To z powodu przeładowania metod

Najbardziej specyficzna metoda jest wybierany w czasie kompilacji.

Jako że "java.lang.String" jest bardziej specyficznym typem niż "java.lang.Object". W twoim przypadku zwraca String.