Erste Schritte Schlüsselwort "this"

Rudi205

Mitglied
Hallo,

bin gerade an folgendem Beispiel, an welchem mir noch noch nicht ganz klar ist, auf was sich this in diesem Fall bezieht.

Folgend das Beispiel:

Klasse Bruch:
Java:
package uebung07;


class Bruch {
    private int zaehler;
    private int nenner;

    Bruch() {
	zaehler = 0;
	nenner = 1;
    }

    Bruch(int x) {
	zaehler = x;
	nenner = 1;
    }

    Bruch(int x, int y) {
	zaehler = x;
	nenner = y;

Bruch addiere(Bruch b) {
	int z = zaehler * b.nenner + b.zaehler * nenner;
	int n = nenner * b.nenner;
	Bruch summe = new Bruch(z, n);
	return summe;
    }
    }

Klasse Anteil als Erweiterung der Klasse Bruch
Java:
package uebung07;

/*
 * Klasse Anteil abgeleitet von Bruch
 * Hans-Peter Habelitz
 * 2011-12-22
 */

public class Anteil extends Bruch {
    static Bruch verteilt = new Bruch(0);

    Anteil() {
	super();
    }

    Anteil(int z, int n) {
	super(z, n);
	verteilt = verteilt.addiere(this);
	if (this.getVerteilt() > 1)
	    System.out.println("Fehler!! Es wurde zu viel verteilt!");
    }

    double getVerteilt() {
	return (double) verteilt.getZaehler() / verteilt.getNenner();
    }

}

Meine Frage bezieht sich auf die Zeile mit dem Code:
Java:
verteilt = verteilt.addiere(this);

Ich rufe hier die Methode addiere der Klasse Bruch auf und übergebe this.
Ist this in diesem Fall der vorher erzeugte Bruch durch super(z,n) oder auf was genau bezieht sich das this ?

Vielleicht kann mir neben dieser Frage nochmal an ein, zwei Beispiele das Schlüsselwort "this" erklärt werden.

Für die Hilfe danke ich im Voraus !! :applaus:

Grüße
 

Thallius

Top Contributor
This ist, wie der Name schon sagt, die eigene Referenz. Eigentlich sollte man bei jedem Zugriff auf eine property einer Klasse immer this.propertyname schreiben. Aber dazu ist so ziemlich jeder zu faul :)
Du hast eine property "verteilt" von Typ Bruch. Auf diese könntest du auch mit this.verteilt zugreifen.

Also wenn man es richtig machen wollte, dann würde man schreiben

Java:
this.verteilt=this.verteilt.addiere(this);

Der Parameter für die Methode addiere ist Bruch. Da this von Bruch erbt, ist this eben auch ein Bruch.

Dieses Konstrukt ist schon verwirrend und sicher kein gutes Beispiel für Anfänger.

This ist einfach die Instanz der Klasse selber in der du dich befindest.

Gruss

Claus
 

Rudi205

Mitglied
Also nochmal in meinen Worten vielleicht:

Da die Methode addiere von der Klasse Bruch kommt -
rufe ich quasi mit verteilt.addiere(this) - den einen Schritt vorher festgelegten Bruch auf den ich mit super(z, n) initialisiert habe ?

Grüße
 

Rudi205

Mitglied
Vielleicht wird es noch klarer wenn ich diesen Teil mit dazu nehme:

Java:
package uebung07;

/*
 * Programm Anteiltest zum Testen der Klasse Anteil
 * Hans-Peter Habelitz
 * 2011-12-22
 */

public class Anteiltest {
    public static void main(String args[]) {
	int vermoegen = 200000;
	Anteil a1 = new Anteil(1, 4);
	Anteil a2 = new Anteil(1, 2);
	System.out.println("Anteil a1: " + a1.bruchtoString());
	System.out.println("Betrag von a1: " + vermoegen * a1.dezimalwert());
	System.out.println("Anteil a2: " + a2.bruchtoString());
	System.out.println("Betrag von a2: " + vermoegen * a2.dezimalwert());
	System.out.println("Verteilt: " + Anteil.verteilt.bruchtoString());
	System.out.println("Rest: " + a1.getRest().bruchtoString());
	System.out.println("Restbetrag: " + vermoegen
		* a1.getRest().dezimalwert());
    }

}

wie genau funktioniert der Aufruf System.out.println("Verteilt: " + Anteil.verteilt.bruchtoString());??

Blicke hier nicht ganz durch
 

kaoZ

Top Contributor
Mal abgesehen davon das das echt hässlich ist :

"Verteilt: " + Anteil.verteilt.bruchtoString());??

passiert hier folgendes , du greifst hier aus der Klasse
Code:
Anteiltest
statisch auf die Klasse
Code:
Anteil
, und darin über die Referenz
Code:
verteilt
, auf ein statisches Objekt vom Typ
Code:
Bruch
zu, und dann auf dessen statische Methode
Code:
bruchtoString
(die eigentlich bruchToString(); heißen müsste).

mal abgesehen davon sollte man Konkatenation per Punkt Operator vermeiden, alleine schon weil sonst solche verwirrenden Konstrukte dabei heraus kommen können.

[TIPP]in Java schreibt man Klassen UpperCamelCase und Methoden und Variablen lowerCamelCase
Java:
public MeineKlasse{...}

int ichBinEineVariable;

public void testMethode(){...}
[/TIPP]
 
Zuletzt bearbeitet:

turtle

Top Contributor
Stimme wieder, wie eigentlich immer kaoZ zu(;) und ergänze

mal abgesehen davon sollte man Konkatenation per Punkt Operator vermeiden, da es zu NPE (Null-Pointer-Exception) kommen kann, wenn einer der Aufrufe in der Kette mal null zurück liefert...
 

Ähnliche Java Themen

Neue Themen


Oben