Klaus: Kennst sich jemand mit php UND Java aus ? " this ?

Guten Abend,

ich total deprimiert. Vor ca 1.5 Jahren beschäftigte ich mit für ein halbes Jahre mit Java und es war mit zu schwierig.
So dachte ich mit ich lasse es einfach mal etwas ruhen und schaue mir etwas einfacheres an.

Jetzt programmiere ich die ganze Zeit in php und bin auch in der OOP etwas firmer geworden.

Heute dachte ich mir. Hey, jetzt hast Du OOP gerafft.
Jetzt kommt es:

Was ich nie in java gerafft habe war das mit dem bezeichner "this".
Da php diesen Bezeichner auch hat und ich denke,dass ich ihn verstehe, da ich ihn ja die ganze Zeit benutze bin ich heute mal wieder zu meinem alten Java Buch zurückgekehrt um mich endlich mit Java auseinanderzusetzen.

Und was stelle ich geschockt fest.

Der Bezeichner "this" wird in Java doch anderes verwendet.
Wenn ich in php zum Beispiel ein Objekt erzeuge und eine Methode dieses Objektes benutzt eine andere des gleichen Objektes muss ich in php immer $this->functionsname(); schreiben.

Jetzt schau ich in mein Java Buch und dort geschieht dieses nicht.
Dort taucht es zum Beispiel im Konstruktor auf um ein Attribut des Objektes zu setzen.

Könnte mir vielleicht jemand gütigerweise EIN UND FÜR ALLE MAL die Bedeutung von "This" erklären?
Das kling vielleicht ein bischen doof, aber das würde mir megaviel bringen.

Benutze ich "this" etwa die ganzen Monate in php falsch?

Wie ist es mit Java ?

Danke 100000000 fach!!

Einen schönen Abend und ein schönes Wochenende.

Klaus

  1. Holladiewaldfee,

    Benutze ich "this" etwa die ganzen Monate in php falsch?

    Ich kann kein Java, aber ich gehe davon aus, daß $this wie in PHP ein Referenz auf das aktuelle Objekt ist.

    Ciao,

    Harry

    --
      Herbst ist Wanderzeit!
      http://harry.ilo.de/projekte/berge/
  2. Hallo Klaus,

    this bezeichnet immer das aktuelle Objekt.

    Jetzt schau ich in mein Java Buch und dort geschieht dieses nicht.
    Dort taucht es zum Beispiel im Konstruktor auf um ein Attribut des Objektes zu setzen.

    Das sind dann diese seltsamen Beispiele, in denen ein Übergabeparameter denselben Namen hat wie ein Attribut des Objekts:

    setS(int s) {
      this.s = s;
    }

    Wenn Du im Beispiel oben den Übergabeparameter umbenennst, dann kannst Du this weglassen:
    setS(int ps) {
      s = ps;
    }

    Grüße
    Andreas

    --
    "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
    (Rich Cook)
  3. Hallo Klaus

    Der Bezeichner "this" wird in Java doch anderes verwendet.

    Nein. Nur kannst du ihn in der Regel weglassen.

    Wenn ich in php zum Beispiel ein Objekt erzeuge und eine Methode dieses Objektes benutzt eine andere des gleichen Objektes muss ich in php immer $this->functionsname(); schreiben.

    In Java sind die beiden Schreibweisen this.methode() und methode() gleichwertig. Normalerweise benötigst du this nur, wenn du in einer Methode eine Instanz- oder Klassenvariable überlagerst.

    Jetzt schau ich in mein Java Buch und dort geschieht dieses nicht.
    Dort taucht es zum Beispiel im Konstruktor auf um ein Attribut des Objektes zu setzen.

    Hier tritt der obige Fall auf. Die Variablen im Konstruktor haben den gleichen Namen, sodass die Instanzvariablen mit this davon unterschieden werden müssen.

    Könnte mir vielleicht jemand gütigerweise EIN UND FÜR ALLE MAL die Bedeutung von "This" erklären?

    Bitte nicht schreien!
    This zeigt auf das aktuelle Objekt, zu dem die Methode gehört.

    Das kling vielleicht ein bischen doof, aber das würde mir megaviel bringen.

    Du hast recht, "megaviel" klingt wirklich ein bisschen doof ;-)

    Benutze ich "this" etwa die ganzen Monate in php falsch?

    Nein.

    Schöne Grüße,

    Johannes

    --
    ss:| zu:} ls:[ fo:} de:] va:} ch:° sh:( n4:| rl:( br:^ js:| ie:{ fl:( mo:}
    1. Hi,

      Vielen Dank für die Antworten!!!!!!!!!

      Nein. Nur kannst du ihn in der Regel weglassen.

      Aber in php nicht?

      In Java sind die beiden Schreibweisen this.methode() und methode() gleichwertig. Normalerweise benötigst du this nur, wenn du in einer Methode eine Instanz- oder Klassenvariable überlagerst.

      Was war noch mal der Underschied zwischen den beiden?

      Also kommt in Java this nur im Konstruktor vor?

      Hier tritt der obige Fall auf. Die Variablen im Konstruktor haben den gleichen Namen, sodass die Instanzvariablen mit this davon unterschieden werden müssen.

      Also ich dachte biher immer das this.varibalenname bedeutet, dass die ganze Klasse die varibale kennt.

      Beispielklasse:

      class Tisch
      {
          $tischdecke;
          $farbe;

      Tisch($tischdecke)
          {
              $this->tischdecke = $tischdecke;
          }

      function setTischfarbe($farbe)
          {
              $this.tischfarbe = $farbe;
          }

      function returnTischfarbe
          {
              return $this->tischfarbe;
          }
      }

      Also mein Verständnis war immer dass ich, wenn ich setTischfarbe aufrufe, $this.tischfarbe = $farbe; schreibe, um $farbe (Attribut der Klasse) zu setzen. Wenn ich das $this in der Methode setTischfrabe weglasse, kann die Methode returnTischfarbe ja nix zurückgeben, wenn ich sie aufrufe. Sehe ich das so richtig?

      Wie sähe diese Klasse in Java aus?

      Danke

      Klaus

      1. Hallo Klaus

        Nein. Nur kannst du ihn in der Regel weglassen.

        Aber in php nicht?

        Nein.

        In Java sind die beiden Schreibweisen this.methode() und methode() gleichwertig. Normalerweise benötigst du this nur, wenn du in einer Methode eine Instanz- oder Klassenvariable überlagerst.

        Was war noch mal der Underschied zwischen den beiden?

        Eine Instanzvariable gilt nur für das aktuelle Objekt während eine Klassenvariable in allen Objekten einer Klasse denselben Wert hat.

        Also kommt in Java this nur im Konstruktor vor?

        Oder in anderen Methoden, in denen es nötig ist, eine Instanz-/Klassenvariable zu verwenden, die durch eine lokale Variable gleichen Namens verdeckt wird.

        Beispielklasse:

        class Tisch
        {
            $tischdecke;
            $farbe;

        Fehlen hier nicht zwei 'var'?

        Tisch($tischdecke)
            {
                $this->tischdecke = $tischdecke;
            }

        function setTischfarbe($farbe)
            {
                $this.tischfarbe = $farbe;

        Tippfehler, es müsste $this->tischfarbe heißen.

        }

        function returnTischfarbe
            {
                return $this->tischfarbe;
            }
        }

        Also mein Verständnis war immer dass ich, wenn ich setTischfarbe aufrufe, $this.tischfarbe = $farbe; schreibe, um $farbe (Attribut der Klasse) zu setzen. Wenn ich das $this in der Methode setTischfrabe weglasse, kann die Methode returnTischfarbe ja nix zurückgeben, wenn ich sie aufrufe. Sehe ich das so richtig?

        Ja. in setTischfarbe hast du eigentlich zwei Variablen mit dem Namen Farbe. Einmal die lokale Variable, in der das Argument der Funktion gespeichert ist und die Instanzvariable. Mit $this->farbe sagst du dem PHP-Interpreter, dass er die Instanzvariable nehmen soll, ansonsten verwendet er die lokale Variable.

        In PHP müssen lokale Variablen nicht explizit deklariert werden, sondern werden automatisch beim ersten Gebrauch erzeugt. Deshalb kann man das $this nicht weglassen, denn dann würde stattdessen eine lokale Variable mit gleichem Namen erzeugt werden.

        Wie sähe diese Klasse in Java aus?

        public class Tisch
        {
            Tischdecke tischdecke;
            Tischfarbe tischfarbe;

        public Tisch(Tischdecke tischdecke)
            {
                this.tischdecke = tischdecke;
            }

        public void setTischfarbe(Tischfarbe tischfarbe)
            {
                this.tischfarbe = tischdecke;
            }

        public Tischfarbe getTischfarbe()
            {
                return this.tischfarbe; // Das 'this.' ist optional
            }
        }

        tischfarbe und tischdecke sind in diesem Beispiel Instanzen der Klassen Tischfarbe und Tischdecke.

        Schönen Abend noch,

        Johannes

        --
        ss:| zu:} ls:[ fo:} de:] va:} ch:° sh:( n4:| rl:( br:^ js:| ie:{ fl:( mo:}