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 [2015/02/13 14:14]
gthanos
java:this_operator [2017/02/16 11:24] (current)
gthanos [Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this]
Line 1: Line 1:
 ====== ​ Ο τελεστής this ====== ====== ​ Ο τελεστής 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 wint h) { +  private Point origin; 
-       origin ​p; +     
-       width = w+  // the Rectangle class has one constructor 
-       ​height = h+  ​public Rectangle(int width, int heightPoint origin) { 
-   } +    ​width ​= width; 
-    +    height = height
-   ​public Rectangle(int x, int y) { +    ​origin ​origin
-       ​width ​w; +  
-       ​height = h+  ...
-   ​+
-   ....+
 } }
 </​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 p, int w, int h) { +  private Point origin; 
-       ​origin = p; +     
-       this(w,h) +  // the Rectangle ​class has one constructor 
-   } +  public Rectangle(int ​width, int height, Point origin) { 
-    +    this.width = width
-   public Rectangle(int ​w, int h) { +    this.height = height
-       ​width = w+    ​this.origin = origin; 
-       ​height = h+  ​
-   ​+  ...
-   ....+
 } }
 </​code>​ </​code>​
  
-Ο τελεστής **this** δείχνει ​στο τρέχον αντικείμενο ​και χρησιμοποιείται για να προσπελαστεί ένας άλλος κατασκευαστής της ίδιας κλάσης.+__O τελεστής **this** ​υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος ​αντικειμένου (της μορφής **this.**//​variable//​) ​από μία τοπική μεταβλητή (//​variable//​) με το ίδιο όνομα.
  
-===== Πρόσβαση σε πεδία και μεθόδους ​των ​αντικειμένων ​της κλάσης μέσω του τελεστή 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+  public Rectangle(int ​initWidth, int initHeight, Point initOrigin) { 
-       ​height = h+    width = initWidth;​ 
-   ​+    height = initHeight;​ 
-   ​... +    ​origin = initOrigin
-   +  } 
 +   
 +  public Rectangle(int initWidth, int initHeight, int xPos, int yPos) { 
 +    ​width = initWidth
 +    height = initHeight;​ 
 +    origin = new Point(xPos,​yPos)
 +  
 +  ....
 } }
 </​code>​ </​code>​
  
-Εναλλακτικά, το παραπάνω μπορεί να γραφεί ως εξής.+Ιδανικά θα θέλαμε να καλέσουμε έναν κατασκευαστή μέσα από έναν άλλο κατασκευαστή. Στη Java αυτό ​είναι εφικτό με χρήση του τελεστή **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; 
-       this.origin ​origin+     
-       this.width ​width+  public Rectangle(int ​initWidth, int initHeight, Point initOrigin) { 
-       this.height ​height+    ​width ​initWidth
-   ​+    ​height ​initHeight
-   ​...+    ​origin ​initOrigin
 +  
 +   
 +  public Rectangle(int initWidth, int initHeight, int xPos, int yPos) { 
 +    this(initWidth,​ initHeight, new Point(xPos,​yPos));​ 
 +  } 
 +  ....
 } }
 </​code>​ </​code>​
  
-Στον παραπάνω ​κώδικα η τοπική μεταβλητή ​''​origin'' ​που δίνεται ​ως τυπική παράμετρος στον ​κατασκευαστή, συμπίπτει με την μεταβλητή της κλάσης. ​Σε αυτή ​την περίπτωση η τοπική μεταβλητή ρύβει" (shadows) την μεταβλητή του αντικειμένου της κλάσηςΠροκειμένου να έχουμε ​πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης ​θα πρέπει να χρησιμοποιήσουμε ​τον τελεστή **this**. ​+__Το παραπάνω, είναι αποδεκτό από τον compiler της Java__. Ο τελεστής **this** χρησιμοποιείται ​για να κληθεί από ένα κατασκευαστή ​ένας άλλος κατασκευαστής της ίδιας κλάσης. 
 + 
 +<WRAP important 80% center round> 
 +Η κλήση ​ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του ​σώματος του κατασκευαστήΑν δεν το κάνετε και προηγηθεί μία άλλη εντολή πριν την κλήση ​του ​κατασκευαστή θα λάβετε ​ένα μήνυμα λάθους ​από τον compiler. Ενδεικτικό είναι ​το παρακάτω παράδειγμα:  
 + 
 +<code java> 
 +public class Rectangle { 
 +     
 +  private int width; 
 +  private int height; 
 +  private 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.height = height; 
 +  } 
 +  .... 
 +
 +</​code>​ 
 +</​WRAP>​ 
 + 
 + 
 +<WRAP tip 80% center round> 
 +**Συμπερασματικά**
  
-Συμπερασματικά,​ ο τελεστής **this** δείχνει στο τρέχον αντικείμενο και χρησιμοποιείται για να προσπελαστούν δεδομένα ή μεταβλητές που ανήκουν σε αντικείμενα ​της κλάσης.+τελεστής **this** δείχνει στο τρέχον αντικείμενο ​της εκάστοτε κλάσης,​ για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον ​χρησιμοποιείτε τόσο ​για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για ​το τρέχον αντικείμενο. Με χρήση του τελεστή **this** μπορείτε επίσης ​να καλέσετε και μεθόδους της κλάσης από το τρέχον ​αντικείμενο, πράγμα που όμως δεν θα το δείτε, ​καθώς ​στην πράξη δεν υπάρχει ανάγκη για κάτι τέτοιο.
  
-<WRAP tip> +Μπορείτε να δείτε την κλάση ​**Rectangle**, όπως ​διαμορφώνεται με χρήση του τελεστή **this** τόσο για την κλήση ​ενός κατασκευαστή της κλάσης από άλλο, όσο για την πρόσβαση στα πεδία της κλάσης όταν αυτά επισκιάζονται από τοπικές μεταβλητές ή παραμέτρους μεθόδων με το ίδιο όνομα {{:​java:​rectangle.java-this.tgz|εδώ}}.
-τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται.+
 </​WRAP>​ </​WRAP>​
  
-|Προηγούμενο:​ [[:java:this_operator ​Oι τελεστές this και super ]] | Επόμενο:​ [[:​java:​static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|+|Προηγούμενο:​ [[:java:objectsΔημιουργία Αντικειμένων ]] | [[:toc | Περιεχόμενα ​]] | Επόμενο:​ [[:​java:​static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|
  
java/this_operator.1423836855.txt.gz · Last modified: 2016/02/26 11:15 (external edit)