5 Stimmen

Java. Methode überladen

Ich habe zum Beispiel diese Klasse:

public class Col {

static void test(int a)
    {
        System.out.println("int");
    }
    public static void main(String args[])
    {
        Col.test(12);  //1

        Col.test((byte)12); //2

        Col.test((long)100); //3

    }
}

und nun interessiert mich, wie der Algorithmus dieses Codes funktioniert. Ich denke, dass diese Schritte:

1 Zeile - alle korrekte Aufrufmethode mit int-Param, perfekt.

2 Zeilen - Aufruf einer Methode mit Byte-Param...oooops. was tun? Java versuchen, byte zu int zu erweitern? Stimmt das?

3 Zeile Aufruf Methode mit long param... wieder ooops. was tun? konvertieren long zu int Java kann nicht, weil Verlust der Genauigkeit. seine versuchen? Und im Ergebnis - Exception.

Dann füge ich dies hinzu:

 public static void test(Object a)
    {
        System.out.println("Object");
    }

und wenn ein Anruf:

Col.test((long)100);

alles korrekt, keine Ausnahme Welche Beziehung besteht also zwischen dem primitiven Typ long und Object?

7voto

Jon Skeet Punkte 1325502

Ja, es gibt eine implizite Konvertierung von byte a int , aber keine implizite Umwandlung von long a int (wegen der Gefahr des Informationsverlustes).

Im dritten Fall verwenden Sie autoboxing die eine long (primitiver Typ) zu einer Long (Klassenart).

Sie können das sehen, indem Sie den Körper von test zu:

public static void test(Object a)
{
    System.out.println(a.getClass());
}

Es wird dann ausgedruckt class java.lang.Long .

4voto

Andreas Dolk Punkte 110776

Ihr erstes Beispiel zeigt die Konvertierung von primitiven Typen. Das zweite Beispiel zeigt Boxing und Unboxing, was - kurz gesagt - eine bequeme Umwandlung zwischen primitiven Typen (wie long ) und ihre Wrapper-Klassen ( java.lang.Long in diesem Fall).

Überlastung ist die Implementierung von Methoden, die die el mismo Name aber anders Parameter . Hier haben wir zwei Methoden

static void test(int a){}
static void test(Object a){}

und rufen sie mit test((long) 100) . Die erste Methode kann nicht aufgerufen werden, da die JVM eine long zu einer int ohne explizites Casting. Aber die JVM (Version 1.5+) kann die long Wert auf einen Long (autoboxing) und test(Long.valueOf((long) 100)) ist eine gute Ergänzung zur zweiten Methode.

3voto

UVM Punkte 9715

Das liegt daran, dass die Funktion "Auto-Boxing" funktioniert. Eigentlich haben Sie die primitive zu lang und während des Aufrufs Test-Methode automatisch ist es für seine äquivalente Art suchen daher ruft es test(Object a).You kann wie folgt Col.test(new Integer(12)) zu sehen; dies wird auch test(Object a).Also können Sie diesen Link beziehen Feststellen, ob ein Objekt vom primitiven Typ ist

2voto

Mohamed Saligh Punkte 11701
public static void test(Object obj) {
      if (obj instanceof Integer) {
          System.out.println("Integer");
      } else if (obj instanceof Double) {
          System.out.println("Double");
      } else if (obj instanceof Float) {
          System.out.println("Float");
      } else if (obj instanceof Long) {
          System.out.println("Long");
      } 
  }

2voto

javamonkey79 Punkte 17177

Alle Java-Primitive haben entsprechende "Typen", die eigentliche Klassen sind. In Ihrem Beispiel hat long eine entsprechende Klasse Long. Diese Klasse ist eine Erweiterung von Object.

Was Sie erlebt haben, ist Boxing und Unboxing.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X