User Tools

Site Tools


java:this_operator

Ο τελεστής this

Μέσω του τελεστή this μπορούμε:

  • να έχουμε πρόσβαση στα πεδία του τρέχοντος αντικειμένου όταν υπάρχουν και τοπικές μεταβλητές που έχουν το ίδιο όνομα με το αντικείμενο.
  • κατά τη δημιουργία του αντικειμένου να καλέσουμε ένα κατασκευαστή μέσω ενός άλλου κατασκευαστή.

Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης με χρήση του τελεστή this

Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  // the Rectangle class has one constructor
  public Rectangle(int width, int height, Point origin) {
    width = width;
    height = height;
    origin = origin;
  }
  ...
}

Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή/παράμετρος “κρύβει” (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή this, ως εξής:

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  // the Rectangle class has one constructor
  public Rectangle(int width, int height, Point origin) {
    this.width = width;
    this.height = height;
    this.origin = origin;
  }
  ...
}

O τελεστής this υποδεικνύει το τρέχον αντικείμενο. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητή του τρέχοντος αντικειμένου (της μορφής this.variable) από μία τοπική μεταβλητή (variable) με το ίδιο όνομα.

Κλήση ενός κατασκευαστή μέσω άλλου κατασκευαστή με χρήση του τελεστή this

Ας ξαναδούμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα θέλοντας να επιχειρήσουμε να επαναχρησιμοποιήσουμε τμήματα κώδικα ενός κατασκευαστή από έναν άλλο κατασκευαστή.

class Rectangle {
 
  int width;
  int height;
  Point origin;
 
  Rectangle(int initWidth, int initHeight, Point initOrigin) {
    width = initWidth;
    height = initHeight;
    origin = initOrigin;
  }
 
  Rectangle(int initWidth, int initHeight, int xPos, int yPos) {
    width = initWidth;
    height = initHeight;
    origin = new Point(xPos,yPos);
  }
  ....
}

Ιδανικά θα θέλαμε να καλέσουμε έναν κατασκευαστή μέσα από έναν άλλο κατασκευαστή. Στη Java αυτό είναι εφικτό με χρήση του τελεστή this, ως εξής:

class Rectangle {
 
  int width;
  int height;
  Point origin;
 
  Rectangle(int initWidth, int initHeight, Point initOrigin) {
    width = initWidth;
    height = initHeight;
    origin = initOrigin;
  }
 
  Rectangle(int initWidth, int initHeight, int xPos, int yPos) {
    this(initWidth, initHeight, new Point(xPos,yPos));
  }
  ....
}

Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευαστή. Αν δεν το κάνετε και προηγηθεί μία άλλη εντολή πριν την κλήση του κατασκευαστή θα λάβετε ένα μήνυμα λάθους από τον compiler. Ενδεικτικό είναι το παρακάτω παράδειγμα:

class Rectangle {
 
  int width;
  int height;
  Point origin;
 
  Rectangle(int width, int height, Point origin) {
    this.origin = origin;
    /* η κλήση ενός κατασκευαστή μέσα από άλλο
     * κατασκευαστή, χωρίς να είναι 1η εντολή 
     * παράγει μήνυμα λάθους από τον compiler.
     */ 
    this(width, height); 
 
  }
 
  Rectangle(int width, int height) {
    this.width = width;
    this.height = height;
  }
  ....
}

Παρακάτω, μπορείτε να δείτε την κλάση Rectangle, όπως διαμορφώνεται με χρήση του τελεστή this τόσο για την κλήση ενός κατασκευαστή της κλάσης από άλλο, όσο για την πρόσβαση στα πεδία της κλάσης όταν αυτά επισκιάζονται από τοπικές μεταβλητές ή παραμέτρους μεθόδων με το ίδιο όνομα.

Rectangle.java
class Rectangle {
 
  // the Rectangle class has 3 fields
  int width;
  int height;
  Point origin;
 
  // the Rectangle class has two constructors
  Rectangle(int width, int height, Point origin) {
    this.width = width;
    this.height = height;
    this.origin = origin;
  }
 
  Rectangle(int width, int height, int xPos, int yPos) {
    this(width, height, new Point(xPos, yPos));
  }
 
  void setWidth(int width ) {
    this.width = width;
  }
 
  int getWidth() {
    return width;
  }
 
  void setHeight(int height ) {
    this.height = height;
  }
 
  int getHeight() {
    return height;
  }
 
  void setOrigin(Point o) {
    origin = o;
  }
 
  Point getOrigin() {
    return origin;
  }
 
  int getArea() {
       return width * height;
  }
 
  // Move rectangle origin by dx,dy
  void moveOrigin(int dx, int dy) {
    origin.setX( origin.getX() + dx );
    origin.setY( origin.getY() + dy );
  }
}
java/this_operator.txt · Last modified: 2022/02/23 16:10 by gthanos