Zum Inhalt springen

Schlüsselwort this


Eleu

Empfohlene Beiträge

Hallo,

ich habe eine Frage zu dem nachfolgenden java Code

public class A
{
     public void todo(){
     B xy = new B();
     xy.todo(this);

//.. Weitere Methoden in Klasse A

}
}

public class B
{
public void todo(A k){
System.out.println("Mach was");
}
}

public class Haupt{
public static void main(String [] args){
A z = new A();
z.todo();
}
}

Wenn ich in der Klasse Haupt, die Main Methode ausführe, wird mir der Text "Mach was" ausgegeben. Diese Methode ist in Klasse B enthalten und wird durch die Instanz xy und dem Schlüsselwort this der Klasse A verfügbar gemacht. Man könnte aber auch alternativ eine Einfachvererbung programmieren und käme zum gleichen Ergebnis, wenn man die Main Methode ausführt.

public class A extends B
{
 
}

public class B
{
public void todo(){
System.out.println("Mach was");
}
}

public class Haupt{
public static void main(String [] args){
A z = new A();
z.todo();
}
}

Meine Frage wäre, was es mir für einen Vorteil bringt, wenn ich es so mache wie im ersten Beispiel? Ich hätte ja erst mal sogar den Nachteil, nur diese eine Methode aus Klasse B, in der Klasse A zur Verfügung zu haben. Wenn ich es mit extends mache kann ich sofort auf alle weiteren Methoden, insofern es noch weitere Methoden in Klasse B gäbe, zugreifen.

 

Gruß

Eleu 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo kommt denn dieses Beispiel her? Ohne den Kontext zu verstehen, was das Beispiel ausdrücken soll, kann man wohl keine Antwort geben. Im Grunde passiert nur folgendes:

Du erzeugst eine Instanz der Klasse A und rufst die Methode todo() dieser Instanz auf.
Die Instanz der Klasse A wiederrum erzeugt eine Instanz der Klasse B und ruft wiederum todo() der Instanz von B auf.

Deine Main-Methode könnte auch direkt eine Instanz der Klasse B erzeugen:

public static void main(String [] args){
    B b = new B();
    b.todo(new A());
}

Der Parameter von todo() in der Klasse B hat überhaupt keine Bewandtnis und kann entfernt werden.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Minuten schrieb Whiz-zarD:

Wo kommt denn dieses Beispiel her? Ohne den Kontext zu verstehen, was das Beispiel ausdrücken soll, kann man wohl keine Antwort geben. Im Grunde passiert nur folgendes:

Ein ähnliches Beispiel gibt es hier (Im Link weiter unten): 

Java this! Ein verwirrendes Schlüsselwort? | lerne Programmieren (codeadventurer.de)

Ich verstehe den Kontext ja selber nicht, weil ich nicht weiß, oder verstehe, wann man das so macht, wenn man es auch gleich über eine Einfachvererbung machen könnte. 

Was bringt es mir für einen Vorteil, oder anders gefragt, bei welchem Anwendungsfall würde man es so wie in dem Beispiel machen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaub, du hast das Beispiel nicht verstanden. Es geht hier nicht um eine Vererbung. Ausgangslage ist eine Waschanlage, die die Methode wasche() hat und ein Fahrzeug als Parameter hat:

public class Waschanlage {
  public void wasche(Fahrzeug fahrzeug) {
    // mache irgendwas mit fahrzeug
  }

Nun soll die Klasse Fahrzeug die Methode wasche() bekommen:

public class Fahrzeug {
  public void wasche() {
    Waschanlage w = new Waschanlage();
    w.wasche(this);
  }

Das hat jetzt den Vorteil, dass die Waschanlage nicht elementarer Bestandteil des Fahrzeuges ist und außerhalb des Fahrzeuges verwendet werden kann. Ich kann also auch:

Fahrzeug f = new Fahrzeug();
Waschanlage w = new Waschanlage();
w.wasche(f);

schreiben. Eine Vererbung würde hier nicht klappen, da ein Fahrzeug nun mal keine Waschanlage ist. ;)

Allerdings würde man dies in der Praxis so nicht schreiben, da Fahrzeug abhängig von der Waschanlage wäre aber das ist ein anderes Thema.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

Joa, der Kontext fehlt hier irgendwie. 

Ich bin zwar kein Java-Entwickler, aber im Beispiel 1 wird die Methode todo in Klasse A an die todo-Methode von Klasse B delegiert. Damit haben wir mit Klasse A einen sogenannten Wrapper / Decorator um Klasse B gebaut. Indem ich nun ein Objekt von Klasse A instanziere, instanziere ich automatisch ein Objekt von B. 

Das Verfahren kann in bestimmten Kontexten (der hier einfach fehlt) von Vorteil sein, wenn man im top-level-Aufruf einfach noch mehr Dinge macht, die im Aufruf der Subklasse einfach nichts verloren haben. Es handelt sich hier schlichtweg um eine Delegation.

EDIT: OK, nvm. Mit dem Beispiel von @Whiz-zarD sollte ja klar sein.

Bearbeitet von Defneqon
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...