java:this_operator

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
java:this_operator [2015/01/21 17:44]
gthanos created
java:this_operator [2016/01/24 17:00]
gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this]
Line 1: Line 1:
-======  ​Oι τελεστές this και super ======+======  ​Ο τελεστής this ======
  
-===== Ο τελεστής this =====+===== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του ​τελεστή this =====
  
-Ας υποθέσουμε τον παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα+Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα
  
 <code java> <code java>
 public class Rectangle { public class Rectangle {
-   private int widthheight; +     
-   ​private Point origin; +  ​private int width
-  +  private int height; 
-   ​public Rectangle(Point p, int w, int h) { +  private Point origin; 
-       ​origin = p+     
-       ​width = w+  // the Rectangle class has one constructor 
-       ​height = h+  public Rectangle(int ​setWidth, int setHeight, Point o) { 
-   ​+    width = setWidth; 
-   ​... +    height = setHeight;​ 
-   +    ​origin = o
 +  } 
 +   
 +  public Rectangle(int setWidth, int setHeight) { 
 +    ​width = setWidth
 +    height = setHeight
 +  
 +  ....
 } }
 </​code>​ </​code>​
  
-Εναλλακτικά,​ το παραπάνω μπορεί να γραφεί ​ως εξής.+ως εξής
  
 <code java> <code java>
 public class Rectangle { public class Rectangle {
-   private int widthheight; +     
-   ​private Point origin; +  ​private int width
-  +  private int height; 
-   ​public Rectangle(Point origin, ​int width, int height) { +  private Point origin; 
-       origin = this.origin; +     
-       ​width = this.width+  // the Rectangle class has one constructor 
-       ​height = this.height+  ​public Rectangle(int ​setWidth, int setHeight, Point o) { 
-   ​+    this(setWidth, setHeight);​ 
-   ​...+    ​origin ​= o
 +  } 
 +   
 +  public Rectangle(int setWidth, int setHeight) { 
 +    ​width = setWidth
 +    height = setHeight
 +  
 +  ....
 } }
 </​code>​ </​code>​
  
-===== Ο τελεστής ​super =====+__Το παραπάνω,​ είναι αποδεκτό από τον compiler της Java__. ​Ο τελεστής ​**this** χρησιμοποιείται για να κληθεί από ένα κατασκευαστή ένας άλλος κατασκευαστής της ίδιας κλάσης.
  
 +<WRAP important 80% center round>
 +Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευατή. Το παρακάτω παράδειγμα βγάζει μήνυμα λάθους από τον compiler.
 +<code java>
 +public class Rectangle {
 +    ​
 +  private int width;
 +  private int height;
 +  private Point origin;
 +    ​
 +  // the Rectangle class has one constructor
 +  public Rectangle(int setWidth, int setHeight, Point o) {
 +    origin = o;
 +    this(setWidth,​ setHeight);
 +    ​
 +  }
 +  ​
 +  public Rectangle(int setWidth, int setHeight) {
 +    width = setWidth;
 +    height = setHeight;
 +  }
 +  ....
 +}
 +</​code>​
 +</​WRAP>​
 +
 +===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this =====
 +
 +Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα,​ ως εξής
 +
 +<code java>
 +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 = o;
 +  }
 +  ...
 +}
 +</​code>​
 +
 +Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή "​κρύβει"​ (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**, ως εξής:
 +
 +<code java>
 +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 = o;
 +  }
 +  ...
 +}
 +</​code>​
 +
 +__O τελεστής **this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (this.variable) από μία τοπική μεταβλητή (variable) με το ίδιο όνομα.
 +
 +<WRAP tip 80% center round>
 +O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης,​ για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε τόσο για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. Με χρήση του τελεστή **this** μπορείτε επίσης να καλέσετε και μεθόδους της κλάσης από το τρέχον αντικείμενο,​ πράγμα που όμως δεν θα το δείτε στην πράξη, καθώς στην πράξη δεν υπάρχει ανάγκη για κάτι τέτοιο.
 +</​WRAP>​
 +
 +|Προηγούμενο:​ [[:​java:​objects| Δημιουργώντας Αντικείμενα ]] | Επόμενο:​ [[:​java:​static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|
  
java/this_operator.txt · Last modified: 2017/02/16 11:24 by gthanos