7 Stimmen

Java Casting mit Methodenaufrufen

Angenommen, ich habe die folgenden Klassen

class A{
    public method(A a) {
        System.out.println(3);
    }
}

class B extends A{
  public void method (A a) {
        System.out.println(2);
  }
  public void method (B b) {
        System.out.println(1);
  }
}

A obj = new B();
obj.method( (B) obj);
((B) obj).method( (B) obj);

Der erste Methodenaufruf gibt 2 aus, während der zweite Methodenaufruf 1 ausgibt. Warum geben beide Methodenaufrufe nicht 1 aus?

4voto

masoud Punkte 53069

void Methode (B b) von B ist für sein Elternteil A völlig unbekannt.

Es ist logisch, denn in obj.methode((B) obj); ist der Typ von obj A, der gemäß der Polymorphie-Regel nur die void Methode(A a)-Version der Klasse B aufrufen kann.

Klasse B erweitert A {

    // Dies ist eine überschriebene Methode, die für A sichtbar ist
    public void methode(A a) {
        System.out.println(2);
    }

    // Dies ist eine überladene Methode, die von A unbekannt ist
    public void methode(B b) {
        System.out.println(1);
    }
}

Sie können diese SO-Antwort lesen, die Override vs. Overload erklärt.

3voto

ssedano Punkte 8079

Weil Java die Methode zur Laufzeit auswählt. Und der Compiler nur die "linke Seite" einer Zuweisung berücksichtigt.

Wenn Sie also A obj = new B() eingeben, sieht der Compiler nur die Methoden in der Klasse A.

1voto

Kishore Punkte 819

Der erste Methodenaufruf erfolgt unter Verwendung des Objektverweises vom Typ A, daher wird die entsprechende Methode, die überschrieben werden könnte, aufgerufen.

Im zweiten Fall wird zuerst ein Cast auf Typ B durchgeführt, daher wird die entsprechende Methode, die in der Klasse B definiert ist, also

Methode (B b)

aufgerufen.

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