2014-06-19 12 views
5

ich diesen verwirrenden Code haben:Warum Konstruktoren mit Array als Parameter Konstruktoren mit Objekt in Parameter [Java] vorangehen?

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); 
    } 
} 

Wenn "kompiliert" und zeigt das Programm "Double Array" ausführen, warum Arrays voraus Objekt? Gibt es eine andere Konstruktorsituation, in der solch ein verwirrendes Verhalten auftritt?

+0

Warum die enge Abstimmung? Es ist ziemlich klar, was er/sie fragt –

+1

mögliche Duplikate von [Welche Überladung wird für null in Java ausgewählt?] (Http://stackoverflow.com/questions/1545501/which-overload-will-get-selected-for- null-in-java) und [Wie wählt Java aus, welcher Konstruktor verwendet werden soll?] (http://stackoverflow.com/questions/12057333/how-does-java-choose-which-constructor-to-use) - Beachten Sie die 2. ist * genau * der gleiche Code (Hausaufgabe?) –

Antwort

4

Ein double[] ist ebenfalls ein Object, und wenn Sie den Konstruktor (oder die Methode) auswählen, wählt Java den mit dem spezifischsten Parametertyp, der immer noch übereinstimmt. Da null mit jedem Parametertyp übereinstimmt, entspricht der spezifischste Typ double[] hier.

Es ist nicht verwirrend, wenn Sie diese Regel kennen, aber dies tritt auf, wenn zwei oder mehr überladene Konstruktoren (oder zwei oder mehr überladene Methoden) sich nur dadurch unterscheiden, dass einer der Parametertypen in einer davon eine Unterklasse ist Parameter in einem anderen.

Die JLS, Section 15.12.2.5 Staaten wie Java die Methode/Konstruktor wählt aufzurufen, wenn Spiel mehrere überladene Methoden/Konstrukteurs:

Die Java-Programmiersprache die Regel verwendet, die die spezifische Methode gewählt wird.

und

Die informelle Intuition ist, dass ein Verfahren präziser ist als ein anderes, wenn eine durch das erste Verfahren behandelt Aufruf auf dem anderen ohne Fehler bei der Kompilierung weitergegeben werden konnten.

Verwandte Themen