java:this_operator

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:this_operator [2016/01/24 17:00]
gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this]
java:this_operator [2017/02/16 11:24] (current)
gthanos [Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this]
Line 1: Line 1:
 ====== ​ Ο τελεστής this ====== ====== ​ Ο τελεστής this ======
  
-===== Πρόσβαση στους ​κατασκευαστές της κλάσης μέσω του τελεστή this =====+===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων ​της κλάσης μέσω του τελεστή this =====
  
-Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα+Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής
  
 <code java> <code java>
Line 13: Line 13:
     ​     ​
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
-  public Rectangle(int ​setWidth, int setHeight, Point o) { +  public Rectangle(int ​width, int height, Point origin) { 
-    width = setWidth+    width = width
-    height = setHeight+    height = height
-    origin = o;+    origin = origin;
   }   }
-  ​ +  ...
-  public Rectangle(int setWidth, int setHeight) { +
-    width = setWidth; +
-    height = setHeight;​ +
-  } +
-  ....+
 } }
 </​code>​ </​code>​
  
-ως εξής+Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή ή παράμετρος "​κρύβει"​ (//​shadows//​) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**, ​ως εξής:
  
 <code java> <code java>
Line 37: Line 32:
     ​     ​
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
-  public Rectangle(int ​setWidth, int setHeight, Point o) { +  public Rectangle(int ​width, int height, Point origin) { 
-    this(setWidth, setHeight)+    this.width = width
-    origin = o;+    ​this.height = height; 
 +    this.origin = origin;
   }   }
-  ​ +  ...
-  public Rectangle(int setWidth, int setHeight) { +
-    width = setWidth; +
-    height = setHeight;​ +
-  } +
-  ....+
 } }
 </​code>​ </​code>​
  
-__Το παραπάνωείναι αποδεκτό από τον ​compiler ​της Java__. Ο τελεστής **this** ​χρησιμοποιείται ​για ​να κληθεί από ένα κατασκευαστή ένας άλλος κατασκευαστής της ίδιας κλάσης.+__O τελεστής **this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω ​τρόπο μπορούμε να διακρίνουμε μία μεταβλητής ​του τρέχοντος αντικειμένου (της μορφής **this.**//​variable//​) από ​μία τοπική μεταβλητή (//​variable//​) με το ίδιο όνομα
 + 
 +===== Πρόσβαση στους κατασκευαστές της ​κλάσης μέσω του τελεστή this ===== 
 + 
 +Ας ξαναδούμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε ​προηγούμενα θέλοντας να επιχειρήσουμε να επαναχρησιμοποιήσουμε τμήματα κώδικα ενός ​κατασκευαστή ​από ​έναν άλλο κατασκευαστή. ​
  
-<WRAP important 80% center round> 
-Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευατή. Το παρακάτω παράδειγμα βγάζει μήνυμα λάθους από τον compiler. 
 <code java> <code java>
 public class Rectangle { public class Rectangle {
Line 61: Line 54:
   private Point origin;   private Point origin;
     ​     ​
-  ​// the Rectangle class has one constructor +  public Rectangle(int ​initWidth, int initHeight, Point initOrigin) { 
-  ​public Rectangle(int ​setWidth, int setHeight, Point o) { +    ​width initWidth
-    ​origin ​o+    ​height = initHeight
-    ​this(setWidth,​ setHeight)+    ​origin = initOrigin;
-    ​+
   }   }
   ​   ​
-  public Rectangle(int ​setWidth, int setHeight) { +  public Rectangle(int ​initWidth, int initHeight, int xPos, int yPos) { 
-    width = setWidth+    width = initWidth
-    height = setHeight;+    height = initHeight;​ 
 +    origin = new Point(xPos,​yPos);
   }   }
   ....   ....
 } }
 </​code>​ </​code>​
-</​WRAP>​ 
  
-===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this ===== +Ιδανικά θα θέλαμε να καλέσουμε έναν κατασκευαστή μέσα ​από έναν άλλο κατασκευαστή. Στη Java αυτό είναι εφικτό με χρήση του τελεστή **this**, ως εξής:
- +
-Ας ξαναγράψουμε ​το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής+
  
 <code java> <code java>
Line 88: Line 78:
   private Point origin;   private Point origin;
     ​     ​
-  ​// the Rectangle class has one constructor +  public Rectangle(int ​initWidth, int initHeight, Point initOrigin) { 
-  ​public Rectangle(int ​width, int height, Point origin) { +    width = initWidth
-    width = width+    height = initHeight
-    height = height+    origin = initOrigin;
-    origin = o;+
   }   }
-  ...+  ​ 
 +  public Rectangle(int initWidth, int initHeight, int xPos, int yPos) { 
 +    this(initWidth,​ initHeight, new Point(xPos,​yPos));​ 
 +  } 
 +  ....
 } }
 </​code>​ </​code>​
  
-Στον παραπάνω ​κώδικα οι τοπικές παράμετροι του κατασκευαστή ​συμπίπτουν με τα ονόματα ​των μεταβλητών της κλάσης. ​Σε αυτή ​την περίπτωση η τοπική μεταβλητή ρύβει" (shadows) την μεταβλητή του αντικειμένου της κλάσηςΠροκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει ​να χρησιμοποιήσουμε τον τελεστή **this**, ​ως εξής:+__Το παραπάνω, είναι αποδεκτό από τον compiler της Java__. Ο τελεστής **this** χρησιμοποιείται για να κληθεί από ένα ​κατασκευαστή ​ένας άλλος κατασκευαστής της ίδιας κλάσης. 
 + 
 +<WRAP important 80% center round> 
 +Η κλήση ​ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του ​σώματος του κατασκευαστήΑν δεν το κάνετε και ​προηγηθεί μία άλλη εντολή πριν την κλήση ​του ​κατασκευαστή θα λάβετε ​ένα μήνυμα λάθους από ​τον ​compiler. Ενδεικτικό ​είναι το παρακάτω παράδειγμα
  
 <code java> <code java>
Line 107: Line 103:
   private Point origin;   private Point origin;
     ​     ​
-  // the Rectangle class has one constructor 
   public Rectangle(int width, int height, Point origin) {   public Rectangle(int width, int height, Point origin) {
 +    this.origin = origin; ​
 +    this(width, height);
 +    ​
 +  }
 +  ​
 +  public Rectangle(int width, int height) {
     this.width = width;     this.width = width;
     this.height = height;     this.height = height;
-    this.origin = o; 
   }   }
-  ...+  ​....
 } }
 </​code>​ </​code>​
 +</​WRAP>​
  
-__O τελεστής **this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (this.variable) από μία τοπική μεταβλητή (variable) με το ίδιο όνομα. 
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης,​ για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε τόσο για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. Με χρήση του τελεστή **this** μπορείτε επίσης να καλέσετε και μεθόδους της κλάσης από το τρέχον αντικείμενο,​ πράγμα που όμως δεν θα το δείτε ​στην πράξη, καθώς στην πράξη δεν υπάρχει ανάγκη για κάτι τέτοιο.+**Συμπερασματικά** 
 + 
 +O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης,​ για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε τόσο για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. Με χρήση του τελεστή **this** μπορείτε επίσης να καλέσετε και μεθόδους της κλάσης από το τρέχον αντικείμενο,​ πράγμα που όμως δεν θα το δείτε, καθώς στην πράξη δεν υπάρχει ανάγκη για κάτι τέτοιο
 + 
 +Μπορείτε να δείτε την κλάση **Rectangle**,​ όπως διαμορφώνεται με χρήση του τελεστή **this** τόσο για την κλήση ενός κατασκευαστή της κλάσης από άλλο, όσο για την πρόσβαση στα πεδία της κλάσης όταν αυτά επισκιάζονται από τοπικές μεταβλητές ή παραμέτρους μεθόδων με το ίδιο όνομα {{:​java:​rectangle.java-this.tgz|εδώ}}.
 </​WRAP>​ </​WRAP>​
  
-|Προηγούμενο:​ [[:​java:​objects| Δημιουργώντας Αντικείμενα ]] | Επόμενο:​ [[:​java:​static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|+|Προηγούμενο:​ [[:​java:​objects| Δημιουργία Αντικειμένων ]] | [[:toc | Περιεχόμενα ]] | Επόμενο:​ [[:​java:​static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|
  
java/this_operator.1453654858.txt.gz · Last modified: 2016/02/26 11:15 (external edit)