2014-06-19 11 views
5

Mam ten kod mylący:dlaczego konstruktory z tablicą jako parametrem poprzedzają konstruktory obiektem w parametrze [java]?

public class Confusing { 
    private Confusing(Object o){ 
     System.out.println("Object"); 
    } 
    private Confusing(double[]dArray){ 
     System.out.println("double array"); 
    } 
    public static void main(String[] args){ 
     new Confusing(null); 
    } 
} 

Kiedy „skompilowany” i uruchom program „podwójne wyświetlacze tablicę” dlaczego tablice poprzedzać obiekt? Czy istnieje jakakolwiek sytuacja konstruktora, w której wystąpi takie mylące zachowanie?

+0

Dlaczego blisko głos? Jest całkiem jasne, o co on/ona pyta: –

+1

możliwy duplikat [Które przeciążenie zostanie wybrane dla null w Javie?] (Http://stackoverflow.com/questions/1545501/which-overload-will-get-selected-for- null-in-java) i [W jaki sposób Java wybiera, którego konstruktora użyć?] (http://stackoverflow.com/questions/12057333/how-does-java-choose-which-constructor-to-use) - Uwaga drugi to * dokładnie * ten sam kod (zadanie domowe?) –

Odpowiedz

4

A double[] to również Object, a przy wyborze, który konstruktor (lub metoda), Java wybierze ten z najbardziej specyficznym typem parametru, który wciąż pasuje. Ponieważ null będzie pasował do dowolnego typu parametru, najbardziej odpowiedni typ pasuje, a tutaj jest double[].

Po zaznajomieniu się z tą zasadą nie jest to mylące, ale wystąpi to, gdy dwa lub więcej przeciążonych konstruktorów (lub dwie lub więcej przeciążonych metod) różni się tylko tym, że jeden z typów parametrów w jednym z nich jest podklasą odpowiedniego parametr w innym.

The JLS, Section 15.12.2.5 stanach jak Java wybiera metody/konstruktora powołać, gdy wiele metod przeciążonych konstruktorów/mecz:

Język programowania Java wykorzystuje zasadę, że najbardziej specyficzna metoda jest wybrany.

i

Nieformalna intuicja jest to, że jedna metoda jest bardziej szczegółowy niż jakikolwiek inny, jeśli wywołanie obsługiwane przez pierwszy metody mogą być przekazywane do drugiego bez błędów kompilacji.

Powiązane problemy