Lernziele

Zentrale Konzepte in diesem Kapitel: Methoden-Polymorphie, statische und dynamischer Typ, Überschreiben von Methoden, dynamische Methodensuche
Java-Konstrukte in diesem Kapitel: super (in Methoden), toString, protected, instanceof


11.1 Statischer und dynamischer Typ

Konzept
Der statische Typ einer Variablen v ist der Typ, mit dem die Variable im Quelltext der Klasse deklariert wurde.

Wir nennen den deklatierten Typ einer Variablen ihren statischen Typ. denn er wird im Quelltext deklariert.

Z.B Fahrzeug f1 = new Fahrzeug();

Konzept
Der dynamische Typ einer Variablen v ist der Typ des Objekts, das zurzeit in der Variablen v gehalten wird.

Wir nennen den Typ des Objekt, auf das eine Variable verweist, ihren dynamischen Typ, denn dieser hängt von Zuweisungen zur Laufzeit ab

Z.B. Fahrzeug f1 = new Auto();

11.2 Überschreiben von Methoden

Hier diskutieren wir den Entwurf, in dem sowohl die Super als auch die Subklassen eine Methode bspw. namens “anzeigen” haben. Der Kopf aller anzeigen-Methoden sind gleich

Konzept
Überschreiben einer Methode: Eine Subklasse jann die Implementierung einer Methode überschreiben. Dazu deklariert die Subklasse eine Methode mit der gleichen Signatur wie in der Superklasse, implementiert diese jedoch mit einem anderen Rumpf. Die überschreibende Methode wird dann bei Aufrufen an Objekte der Unterklasse vorgezogen

Man kann @Override vor die Version der Subklasse setzen um deutlich zu machen, dass hier eine neue Version eienr geerbten Methode definiert wird

Hinweis bei diesem Ansatz: Die Methode aus der Superklasse wird überhaupt nicht ausgeführt, stattdessen aber die der Subklassen.

11.3 super-Aufrufe in Methoden

Kann nur aufgerufen werden wenn die Superklasse Methoden als public definiert.

public void anzeigen()
{
  super.anzeigen(); // Die gleiche Methode aus der Superklasse
  System.out.println("    ["+dateiname+"]   ");
  System.out.println(" "+ueberschrift);
}

Drei Details sind hier zu beachten:
– Im Gegensatz zu super-Aufrufen in Konstruktoren wird der Name der Methode des Superklasse explizit genannt. Ein Super-Aufruf in einer Methode hat immer folgende Form:
super.Methodenname( Parameterliste)
– super-Aufruf kann in einer Methode an jeder beliebigen Stelle in der Methode erfolgen.
– super-Aufrufen in einer Methode sind im Gegensatz zu einem Aufruf in Konstruktoren optional.

11.4 Methoden-Polymorphie

Konzept
Methoden-Polymorphie: Methodenaufrufen in Java sind polymorph. Derselbe Methodenaufruf kann zu unterschiedlichen Zeitepunkten verschiedene Methoden aufrufen, abhängi vom dynamischen Typ der Variablen, mit der der Aufruf durchgeführt wird.

Siehe Beispiel: einsendung.anzeigen() im Buch. S. 414

11.5 Methoden auis Object: toString

Die Methode toString dient dazu, eine String -Repräsentation eines Objekts zu liefern. Das ist sehr nützlich für solche Objekte, die irgendwann einam als Text in einer Benutzeroberfläche sichtbar werden.

Konzept
Jedes Objekt in Java bietet eine Methode toString an, die eine StringRepräsentation des Objekts liefert. Um diese Methode nützlich zu machen kann sie in Subklassen überschrieben werden.

Hinweis die equals-Methode kann auch überschrieben werden

11.6 Objektgleichheit: equlas und hashCode

  • Referenzgleichheit ==
    Wenn der folgende Test true ergibt, dann verweisen var1 und var2 auf dasseöbe Objekt und false wenn jede Variable auf etwas anderes verweist: var1 == var2. Inhalte werden bei der Referenzgleichheit nicht berücksichtigt bzw unberücksichtigts

    bsp. var1.equals(var2)
    public boolean equals(Object obj)
    {
    return this == obj;
    }
// Wenn die Methode überschrieben wird
public boolean equals(Object obj)
{
    if(this == obj){
      return true; //Refernzgleichheit
    }
    if(!(obj instanceof Student)){
      return false;
    }
    // Zugriff auf die Datenfelder des anderen Studenten
    Student anderer = (Student) obj;
    return name.equals(anderer.name) &&
      matrikelnummer.equals(anderer.matrikelnummer) &&
      scheine == anderer.scheine;
}

Die erste Prüfung dient lediglich der Effizienzsteigeung. Wenn dem Objekt für den Vergleich eine Referenz auf sich selbst übergeben wurde, dann wissen wir das Inhaltsgleichheit vorliegen muss.

Die zweite Prüfung stellt sicher, dass wir zwei Studenten vergleichen. Wenn nicht betrachten wir die beiden Objekte automatisch als verschieden.

Die dritte Prüfung Casting und einer weiteren Variable des richtigen Typs, wird auf deren Details überprüft.

Notes: Immer wenn die equals-Methode überschrieben wird, muss die hashCode-Methode ebenfalls überschrieben werden.

Die hashCode-MEthode wird von Datenstrukturen wie Hashmap und Hashset verwendet, um ein effizientes Einfügen und Suchen von Objekten in diesen Sammlungen zu gewährleitsten.

11.7 Der Zugriff über protected

Konzept
Datenfelder und Methoden, die als protected deklariert sind (in der Superklasse, anstatt public), sind für (direkte und indirekte) Subklassen zugreifbar

DAtenfelder werden überlicherweise nicht als protected deklariert, da dies die Kapselung schwächen würde.

11.8 Der Operator instanceof

Es gibt Fälle, in denen wir denspeziellen dynamischen Typ eines Objekts ermitteln müssen und uns der gemeinsame Supertyp nicht ausreicht.

obj instanceof MeineKlasse // liefert true zurück, wenn der dynamische Typ von obj gleich MeineKlasse oder einer Subklasse von MeineKlasse ist.

ArrayList<NAchrichtenEinsendung> nachirchten = new ArrayList<>();
for(Einsendung einsendung : einsendungen){
  if(einsendung instanceof NachrichtenEinsendung){
    nachrichten.add(einsendung);
  }
}
Zuletzt bearbeitet: 2. November 2022

Autor

Kommentare

Schreibe eine Antwort oder einen Kommentar

Deine EMail-Adresse wird nicht veröffentlicht.