Slide "Non - default constructor, but no default constructor"





  • Wie kann ich mit

    this.width = width;
    

    die Breite ändern? Was macht das this.?



  • @Günster Zunächst einmal können Sie die Breite nicht ändern, sondern Sie erzeugen ein Rechteck gewünschter Breite.

    Im folgenden Beispiel nehme ich der Einfachheit halber an, ein Rechteck hätte nur eine Breite:

    public class Rectangle {
      int width; // Instanzvariable
    
      public Rectangle(int width /* Argument Variable*/){
          this.width = width;
      }
    }
    

    Es gibt hier zwei völlig verschiedene Variable gleichen Namens (das müsste nicht so sein!) in zwei verschiedenen Bezugsrahmen (Scope):

    • Die Instanzvariable, welche einmal pro erzeugter Instanz Speicher belegt
    • Das Argument des Konstruktors. Bezugsrahmen ist der Konstruktor, also der durch das Klammerpaar {...} definierte Methodenrumpf.

    Beide haben nix aber auch gar nichts miteinander zu tun. Wenn ich nun einfach schreibe:

    width = width;
    

    so ist nicht klar, dass die Argument Variable width an die Instanzvariable width zugewiesen werden soll. Der Compiler »sieht« nämlich rechts und links des Gleichheitszeichens den Bezugsrahmen (scope) der Argumentvariablen und warnt daher vor einer sinnlosen Selbstzuweisung. Dies lässt sich durch explizites Qualifizieren eben jenes Instanzbezugsrahmens lösen:

    this.width = width;
    

    Jetzt sorgt das this Keyword dafür, dass als Bezugsrahmen die Instanz genommen wird und man erreicht das Gewünschte.

    Siehe auch genau dazu die Folien 267 und 268.


Log in to reply