Abgrezung von Bezeichnern

AkiHawasaki

Mitglied
Ich habe 2 Klassen erschaffen. Der Sinn des Programms ist es einen Bruch zu kürzen. Den größt möglichen gemeinsamen Teiler.

Ich habe eine Klasse Bruch genannt, die andere Bruchtest1.

In Bruch steht folgendes:
Java:
package uebung05;
public class Bruch {
    int zaehler;
    int nenner;
    void ausgeben(){
        int zaehler=0;
        System.out.println(this.zaehler + "/" + nenner);
    }
    void kuerzen(){
        int m,n,r;
        m=Math.abs(zaehler);
        n=Math.abs(nenner);
        r=m%n;
        zaehler /=n;
        nenner /=n;
    }


}

In Bruchtest1 das:
Java:
package uebung05;
public class Bruchtest1 {
    public static void main (String[]args){
        Bruch b=new Bruch();
        b.zaehler=12;
        b.nenner=4;
        System.out.println("Bruch b = "+b.zaehler + "/" + b.nenner);
        b.ausgeben();
        System.out.println("und nach dem kürzen: ");
        b.kuerzen();
        b.ausgeben();
    }
}

Ich habe in der Klasse Bruch absichtlich eine Variable mit dem Namen zaehler definiert. Lasse ich nun das this. in (this.zaehler + "/" + nenner); weg gibt er mir 0 raus. In meinem schlauen Buch steht dass lokale definierte Variablen das gleichnamigen Datenelemtes eines Objektes überdecken. Mit dem this. verweise ich auf das eigene Objekt in der Klasse Bruch Objekt b. Aber woher weiß denn der Parameter "this" denn was "SEIN" eigenes Objekt ist? Ich kann das hier irgendwie nicht so raus lesen. Wohin genau verweist das this?
 

Meniskusschaden

Top Contributor
Aber woher weiß denn der Parameter "this" denn was "SEIN" eigenes Objekt ist?
Die Methode ausgeben() deiner Klasse Bruch ist eine Objektmethode. Das bedeutet, dass es immer ein Bruch-Objekt geben muß, an dem die Methode aufgerufen wird. Dieses Bruch-Objekt ist es dann, das durch this referenziert wird. In deinem Beispiel b.ausgeben() bezieht sich das in der Implementierung von ausgeben() enthaltene this für diese konkrete Ausführung also auf das durch b referenzierte Bruch-Objekt.
Wenn du ein zweites Bruch-Objekt c erstellen und c.ausgeben() aufrufen würdest, würde sich this bei diesem Aufruf dann auf das durch c referenzierte Bruch-Objekt beziehen.
Ein Aufruf von ausgeben() ist ohne Bruch-Objekt nicht möglich.
 

AkiHawasaki

Mitglied
Ach so, dann habe ich quasi mit b.ausgabe gesagt dass die Methode zum Bruch b gehört? Genauso wie zaehler, nenner und kuerzen zu b gehören?
Dankeschön, jetzt wird alles klarer.
 

Meniskusschaden

Top Contributor
Ach so, dann habe ich quasi mit b.ausgabe gesagt dass die Methode zum Bruch b gehört?
Na ja, die Methode ausgeben() gehört zu allen Brüchen, denn jeder Bruch ist in der Lage, sie auszuführen. Das liegt daran, dass die Methode Bestandteil ihrer Bauanleitung (also der Klasse Bruch) ist. Treffender wäre die Formulierung, dass du dem Bruch b die Nachricht gesandt hast, dass er die Methode ausgeben() ausführen soll.
 

AkiHawasaki

Mitglied
Entschuldigung dass ich ein bisschen schwer von Begriff bin. Bedeutet es dann also dass this sich auf das b bezieht und das b sich wiederrum auf die Methode?
 

Meniskusschaden

Top Contributor
Bedeutet es dann also dass this sich auf das b bezieht
Wenn du b.ausgeben() aufrufst, bezieht es sich dieses Mal auf b. this bezieht sich immer auf das aktuelle Objekt. Wenn man eine Objektmethode programmiert, weiß man ja noch nicht, für welche konkreten Objekte sie später aufgerufen wird. Also braucht man einen Namen (this) unter dem man sich allgemein auf das Objekt beziehen kann, auf dem die Methode später mal aufgerufen wird.
und das b sich wiederrum auf die Methode?
Das b bezieht sich auf den Bruch. Mit b.ausgeben() sagst du dem Bruch b, dass er seine Methode ausgeben() Schritt für Schritt ausführen soll. Immer wenn er dabei auf den Namen this stösst, ist er selbst gemeint. Dadurch weiß er dann, dass z.B. mit this.zaehler sein eigener Zähler gemeint ist und nicht etwa eine Variable, die zufällig ebenfalls zaehler heisst.
 

Neue Themen


Oben