Die Methode überladen und die Wahl der geeignetsten Art
Den Beispiel-code :
public class OverloadingTest {
public static void test(Object obj){
System.out.println("Object called");
}
public static void test(String obj){
System.out.println("String called");
}
public static void main(String[] args){
test(null);
System.out.println("10%2==0 is "+(10%2==0));
test((10%2==0)?null:new Object());
test((10%2==0)?null:null);
}
Und die Ausgabe ist :
Zeichenfolge namens
10%2==0 ist wahr
Objekt namens
Zeichenfolge namens
Den ersten Anruf zu test(null)
ruft die Methode mit String
argument , was verständlich ist, nach The Java Language Specification
.
1) Kann jemand mir erklären, auf welcher Grundlage test()
ist aufgerufen, die in vorherigen Anrufe ?
2) Wieder, wenn wir , sagen eine if
Zustand :
if(10%2==0){
test(null);
}
else
{
test(new Object());
}
Es ruft immer die Methode mit String
argument .
Wird der compiler berechnen Sie den Ausdruck (10%2)
beim kompilieren ? Ich möchte wissen, ob Ausdrücke berechnet werden, die zur compile-Zeit oder zur Laufzeit . Danke.
test((10%2==0)?null:null; Die Letzte Zeile muss eine schließende ) und die main-Methode ist nicht geschlossen.
InformationsquelleAutor NINCOMPOOP | 2012-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java die frühe Bindung verwendet. Die spezifischste Methode gewählt wird, wird zur compile-Zeit. Die spezifischste Methode gewählt, um die Anzahl der Parameter und Typ der Parameter. Die Anzahl der Parameter ist nicht relevant in diesem Fall. Dies lässt uns mit der Art der Parameter.
Welchen Typ die Parameter haben? Beide Parameter sind Ausdrücke, mit der ternäre Bedingungsoperator. Die Frage reduziert sich auf: Was tut die bedingte ternärer operator zurückgeben? Der Typ ist zur compile-Zeit berechnet.
Gegeben sind die beiden Ausdrücke:
Die Regeln der Typ-Evaluierung aufgeführt sind hier. In
B
es ist leicht, beide Bedingungen sind genau die gleichen:null
zurückgegeben werden (unabhängig von der Art werden können) (JLS: "Wenn die zweiten und Dritten Operanden vom gleichen Typ werden kann, der den null-Typ), dann ist der Typ des bedingten Ausdrucks."). InA
der zweite term ist von einer bestimmten Klasse. Wie diese ist spezifischer undnull
substituiert werden können für ein Objekt der KlasseObject
den Typ des gesamten Ausdrucks istObject
(JLS: "Wenn einer von der zweiten und Dritten Operanden der null-Typ und den anderen Typ ein Verweistyp ist, dann ist der Typ des bedingten Ausdrucks ist, dass Referenz-Typ.").Nach der Art der Auswertung der Ausdrücke der Methode, die Auswahl ist wie erwartet.
Beispiel mit
if
Sie geben, ist anders: Sie rufen die Methoden mit Objekten von zwei verschiedenen Arten. Der ternäre Bedingungsoperator immer ausgewertet, um zu eine geben Sie bei compile-Zeit passt, dass beide Begriffe.Ja, aber das ist nicht relevant für die Frage, was type der ganze Ausdruck hat. Die spezifische Ergebnis wird zur Laufzeit ausgewertet, aber die geben Sie den Begriff zur compile-Zeit. Die geben Sie das Ergebnis könnte auch anders sein, natürlich abhängig davon, was der ausgewählte Begriff bedeutet. Also der Zustand ist egal, weil es wird nicht verwendet für Typ Bewertung, nur für die Ergebnis-Auswertung.
Dies wird besonders deutlich, als die Bedingung kann auch ein Ausdruck sein, der kann nur zur Laufzeit ausgewertet. Als ein etwas theoretisches Beispiel:
new Random().nextBoolean()
.wie kann ich rufen Sie die zuletzt bestimmte Methode ??
InformationsquelleAutor Hauke Ingmar Schmidt
Ist das gleiche wie:
Da die Art der
o
istObject
(ebenso wie die Art der(10%2==0)?null:new Object()
)test(Object)
wird immer aufgerufen wird. Der Wert vono
egal.InformationsquelleAutor Piotr Praszmo
JLS 15.25:
So der Typ der
ist Objekt.
in der Tat - vielen Dank.
InformationsquelleAutor assylias
Ihre Antwort : Laufzeit, weil in der Laufzeitumgebung festlegen der parameter ist Instanz von String oder so nicht im compile-Zeit nicht finden können.
InformationsquelleAutor Sam
Dies ist die wirklich schöne Frage.
Lassen Sie mich versuchen zu klären, Ihren code, den Sie oben geschrieben habe.
In diesem
null
wird konvertiert in string-Typ, so ruft dietest(String obj)
je JLS Sie davon überzeugt sind, mit dem Aufruf.Ist, wird zur Rückgabe des boolean - "true" - Wert. So erste boolean - "true" - Wert auf auto cast zu Boolean Wrapper-Klasse object. Boolean wrapper-Objekt ist die Suche nach der besten übereinstimmung mit Ihrer
new Object()
option in der ternäre operator. Und die Methode aufrufen, die mit Object als parameter, damit es ruft die folgende MethodeDes Experiments Willen, Sie können versuchen, die folgenden Kombinationen dann erhalten Sie eine bessere übersichtlichkeit.
Dieser Zeit wieder, es gibt als boolean - "true" - Wert, und es wird wieder Folgen die gleichen Besetzungen wie oben erklärt. Aber dieses mal ist es keine
new Object()
parameter gibt es in Ihrem ternären operator. So wird es sein, die automatische Typumwandlung innull
Objekt. Wieder folgt es der gleichen Methode rufen Sie den ersten Aufruf der Methode.if .. else
- Anweisung. Dann auch der compiler tut das faire Entscheidung mit dem code.Hier die ganze Zeit deine if-Bedingung ist wahr und das aufrufen dieser code
test(null)
. Also alle die Zeit, rufen Sie den erstentest(String obj)
Methode mit String als parameter, wie oben erklärt.InformationsquelleAutor Mukesh Singh Rathaur
Ich glaube, dein problem ist, dass Sie machen die falsche Annahme, Ihre Ausdrücke:
und
Immer call test(null), und das ist, warum Sie gehen durch die test - (Objekt).
ooops danke für die Aufklärung
InformationsquelleAutor Alberto Gutierrez
als @Banthar angegebenen die
?:
- operator weist einen Wert einer Variablen zuerst prüft dann die Bedingung.Auf der anderen Seite, die
if
Zustand erwähnt Sie immer true zurück, so wird der compiler ersetzt das ganzeif-else
block nur mit dem Körper desif
.InformationsquelleAutor adranale
1) die
test()
Methode wird bestimmt durch den Typ des Parameters an der Zusammenstellung Zeit :Ausgabe :
2) Der compiler ist sogar noch schlauer, der kompilierte code ist äquivalent zu nur :
können Sie den bytecode mit
javap -c
:InformationsquelleAutor Julien
Dies ist, was Java-Sprache-Spezifikationen sagen, über das problem.
Dies ist test(String) - Methode in deinem Fall.
Und weil der, dass, wenn Sie hinzufügen...
wird es zeigen Kompilierungsfehler -Die Methode test(String) mehrdeutig ist für die Art OverloadingTest.
Genau wie JLS sagt:
InformationsquelleAutor fiction