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/25 09:08]
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 ​width, int height, Point origin) { 
-   ​+    ​width ​width
-   ​... +    ​height ​height
-   +    ​origin ​o
 +  
 +  ...
 } }
 </​code>​ </​code>​
  
-Εναλλακτικά, το παραπάνω μπορεί να γραφεί ως εξής.+Στον παραπάνω ​κώδικα οι τοπικές ​παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την ​περίπτωση η τοπική μεταβλητή "κρύβει" (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **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 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 width, int height, Point origin) { 
-   ​+    this.width = width; 
-   ​...+    this.height = height; 
 +    ​this.origin = o
 +  
 +  ...
 } }
 </​code>​ </​code>​
  
-===== Ο τελεστής ​super =====+__O τελεστής ​**this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (**this.**//​variable//​) από μία τοπική μεταβλητή (//​variable//​) με το ίδιο όνομα.
  
 +===== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this =====
 +
 +Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα
 +
 +<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) {
 +    width = setWidth;
 +    height = setHeight;
 +    origin = o;
 +  }
 +  ​
 +  public Rectangle(int setWidth, int setHeight) {
 +    width = setWidth;
 +    height = setHeight;
 +  }
 +  ....
 +}
 +</​code>​
 +
 +ως εξής
 +
 +<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) {
 +    this(setWidth,​ setHeight);
 +    origin = o;
 +  }
 +  ​
 +  public Rectangle(int setWidth, int setHeight) {
 +    width = setWidth;
 +    height = setHeight;
 +  }
 +  ....
 +}
 +</​code>​
 +
 +__Το παραπάνω,​ είναι αποδεκτό από τον 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>​
 +
 +
 +<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