Apps für Android programmieren leicht gemacht!
2.9 Überladen, überschreiben, verschatten

2.9 Überladen, Überschreiben, Verschatten

Im vorherigen Artikel haben wir bereits die Vorteile und die Implementierung der Vererbung angesprochen.
Nun ist es an der Zeit, die weiteren Möglichkeiten der Vererbung zu behandeln und weiter in die Materie vorzudringen.

Vor wissen bereits, was passiert, wenn wir eine Klasse B an eine Klasse A vererben und dass wir dann alle Funktionen und Variablen von Klasse B auch in Klasse A nutzen können.
Was wir noch nicht wissen ist was passiert, wenn wir eine Funktion mit gleichem Namen sowohl in Klasse A, als auch in Klasse B haben.

 

Überschreibung:

Wir nehmen an wir besitzen in der Klasse B und in der Klasse A eine Funktion namens „zahl()“ und vererben nun Klasse B an Klasse A.
Welche der beiden Funktionen wird nun genutzt, wenn wir „zahl()“ in Klasse A benutzen?
Ganz einfach, es wird die Funktion „zahl()“ von A benutzt, da „zahl()“ von B hiermit überschrieben wird.

Ein kleines Beispiel:

//Die Klasse B soll später vererbt werden.
class B{

   //Diese Funktion liefert uns die Zahl 5 zurück
   public int zahl(){
      return 5;
   }
}
//Die Klasse A soll nun von B erben, dazu verwenden wir "extends"
class A extends B{

   //Diese Funktion liefert uns die Zahl 1 zurück
   public int zahl(){
      return 1;
   }

   public void rechnen(){
      //Die Variable ergebnis enthält nun den Wert 1, da die Funktion Zahl der Klasse B von der gleichnamigen Funktion der Klasse A überschreiben wurde.
      int ergebnis = zahl();
   }
}

 

Super:

Wir können uns bei der Überschreibung eines kleinen Tricks bedienen, um die bereits überschriebene Funktion „zahl()“ aus unserem obigen Beispiel dennoch nutzbar zu machen.
Wir könnten nämlich in der Funktion „rechnen()“ den Präfix „super.“ benutzen, um die bereits überschriebene Funktion „zahl()“ aus der Klasse B dennoch nutzen zu können.

//Die Klasse B soll später vererbt werden.
class B{

   //Diese Funktion liefert uns die Zahl 5 zurück
   public int zahl(){
      return 5;
   }

}

//Die Klasse A soll nun von B erben, dazu verwenden wir "extends"
class A extends B{

   //Diese Funktion liefert uns die Zahl 1 zurück
   public int zahl(){
      return 1;
   }

   public void rechnen(){
      //Die Variable ergebnis enthält nun den Wert 5, da die Funktion Zahl der Klasse B von der gleichnamigen Funktion der Klasse A überschreiben wurde, aber durch den Präfix "super" dennoch genutzt wird.
      int ergebnis = super.zahl();
   }

}

Wie wir also sehen können, werden überschriebene Funktionen nicht „gelöscht“, sondern einfach nur nicht mehr verwendet.
Mit „super.“ können wir sie dennoch nutzbar machen.

 

Überladung:

Unter der Überladung versteht man etwas ähnliches.
Hier nehmen wir an unsere Klasse B besitzt eine Funktion namens „addiere(int a)“ und die Klasse A besitzt eine Funktion namens „addiere(int a, int b)“. Wir vererben wieder die Klasse B an die Klasse A.
Im Unterschied zu unserem ersten Beispiel haben wir nun 2 Funktion mit gleichem Namen vorliegen, die jedoch verschiedene Übergabeparameter besitzen.
Für müssen für die eine Funktion „addieren“ also eine Zahl übergeben und für die andere zwei Zahlen.
Nun bleiben alle beide Funktion erhalten und beide Funktionen bleiben aufrufbar, allerdings wurde die Funktion „addieren“ überladen.

Ein kleines Beispiel:

//Die Klasse B soll später vererbt werden.
class B{

   //Diese Funktion liefert uns die Zahl 2*a zurück
   public int addieren(int a){
      return a + a;
   }
}
//Die Klasse A soll nun von B erben, dazu verwenden wir "extends"
class A extends B{

   //Diese Funktion liefert uns die Zahl a+b zurück
   public int addieren(int a, int b){
      return a + b;
   }

   public void rechnen(){
      //Die Variable ergebnis enthält nun den Wert 10, da die Funktion addieren der Klasse B genutzt wurde. Wir haben nur einen Wert an addieren übergeben.
      int ergebnis = addieren(5);

      //Die Variable anderesErgebnis enthält nun den Wert 6, da die Funktion addieren der Klasse A genutzt wurde. Wir haben zwei Werte an addieren übergeben.
      int anderesErgebnis = addieren(5, 1);
   }
}

 

 

Verschattung:

Zuletzt existiert noch das Prinzip der Verschattung.
Was ist dass nun wieder? – Naja es handelt sich hierbei eigentlich um eine Überschreibung, nur halt nicht mit Funktionen, sondern mit Variablen.

Ein kleines Beispiel:

//Die Klasse B soll später vererbt werden.
class B{

   //Diese Variable zahl enthält den Wert 5
   public int zahl = 5;
}
//Die Klasse A soll nun von B erben, dazu verwenden wir "extends"
class A extends B{

   //Diese Variable zahl enthält den Wert 10
   public int zahl = 10;

   public void rechnen(){
      //Die Variable ergebnis enthält nun den Wert 10, da die Variable zahl der Klasse A genutzt wurde. Wir haben die Variable zahl, der Klasse B, verschattet.
      int ergebnis = zahl;
   }
}

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld