User Tools

Site Tools


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
Next revision Both sides next revision
java:this_operator [2016/01/24 17:16]
gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this]
java:this_operator [2020/02/21 12:16]
gthanos [Ο τελεστής this]
Line 1: Line 1:
 ======  Ο τελεστής this ====== ======  Ο τελεστής this ======
  
-===== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this =====+Μέσω του τελεστή **this** μπορούμε:  
 +  * να έχουμε πρόσβαση στα πεδία του τρέχοντος αντικειμένου όταν υπάρχουν και τοπικές μεταβλητές που έχουν το ίδιο όνομα με το αντικείμενο. 
 +  * κατά τη δημιουργία του αντικειμένου να καλέσουμε ένα κατασκευαστή μέσω ενός άλλου κατασκευαστή.
  
-Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα+===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this ===== 
 + 
 +Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής
  
 <code java> <code java>
Line 13: Line 17:
          
   // 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 36:
          
   // 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(setWidthsetHeight); +    this.width = width; 
-    origin = o;+    this.height = height; 
 +    this.origin = origin; 
 +  } 
 +  ... 
 +
 +</code> 
 + 
 +<WRAP tip 80% center round> 
 +__O τελεστής this υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητή του τρέχοντος αντικειμένου (της μορφής **this.**//variable//) από μία τοπική μεταβλητή (//variable//) με το ίδιο όνομα. 
 +</WRAP> 
 + 
 +===== Κλήση ενός κατασκευαστή μέσω άλλου κατασκευαστή με χρήση του τελεστή this ===== 
 + 
 +Ας ξαναδούμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα θέλοντας να επιχειρήσουμε να επαναχρησιμοποιήσουμε τμήματα κώδικα ενός κατασκευαστή από έναν άλλο κατασκευαστή.  
 + 
 +<code java> 
 +public class Rectangle { 
 +     
 +  private int width; 
 +  private int height; 
 +  private Point origin; 
 +     
 +  public Rectangle(int initWidthint initHeight, Point initOrigin
 +    width = initWidth; 
 +    height = initHeight
 +    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);
   }   }
   ....   ....
Line 50: Line 75:
 </code> </code>
  
-__Το παραπάνω, είναι αποδεκτό από τον compiler της Java__. Ο τελεστής **this** χρησιμοποιείται για να κληθεί από ένα κατασκευαστή ένας άλλος κατασκευαστής της ίδιας κλάσης.+Ιδανικά θα θέλαμε να καλέσουμε έναν κατασκευαστή μέσα από έναν άλλο κατασκευαστή. Στη Java αυτό είναι εφικτό με χρήση του τελεστή **this**, ως εξής:
  
-<WRAP important 80% center round> 
-Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευατή. Το παρακάτω παράδειγμα βγάζει μήνυμα λάθους από τον compiler. 
 <code java> <code java>
 public class Rectangle { public class Rectangle {
Line 61: Line 84:
   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; +    this(initWidth, initHeight, new Point(xPos,yPos));
-    height = setHeight;+
   }   }
   ....   ....
 } }
 </code> </code>
 +
 +<WRAP tip 80% center round>
 +Ο τελεστής **this** χρησιμοποιείται για να κληθεί από ένα κατασκευαστή ένας άλλος κατασκευαστής της ίδιας κλάσης.
 </WRAP> </WRAP>
  
-===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this ===== +<WRAP important 80% center round> 
- +Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευαστήΑν δεν το κάνετε και προηγηθεί μία άλλη εντολή πριν την κλήση του κατασκευαστή θα λάβετε ένα μήνυμα λάθους από τον compiler. Ενδεικτικό είναι το παρακάτω παράδειγμα
-Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής+
  
 <code java> <code java>
Line 88: Line 111:
   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) {
-    width width+    this.origin origin
-    height = height+    /* η κλήση ενός κατασκευαστή μέσα από άλλο 
-    origin = o;+     * κατασκευαστή, χωρίς να είναι 1η εντολή  
 +     * παράγει μήνυμα λάθους από τον compiler. 
 +     */  
 +    this(width, height);  
 +    
   }   }
-  ...+   
 +  public Rectangle(int width, int height) { 
 +    this.width = width; 
 +    this.height = height; 
 +  } 
 +  ....
 } }
 </code> </code>
 +</WRAP>
  
-Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή "κρύβει" (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**, ως εξής: 
  
-<code java>+<WRAP info 80% center round> 
 +Συμπερασματικά, τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε  
 +  * για να διακρίνεται τα πεδία του τρέχοντος αντικειμένου σε σχέση με τοπικές μεταβλητές που έχουν το ίδιο όνομα με τα πεδία αυτά.  
 +  * να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. 
 + 
 +</WRAP> 
 + 
 +Παρακάτω, μπορείτε να δείτε την κλάση **Rectangle**, όπως διαμορφώνεται με χρήση του τελεστή **this** τόσο για την κλήση ενός κατασκευαστή της κλάσης από άλλο, όσο για την πρόσβαση στα πεδία της κλάσης όταν αυτά επισκιάζονται από τοπικές μεταβλητές ή παραμέτρους μεθόδων με το ίδιο όνομα. 
 + 
 +<code java Rectangle.java>
 public class Rectangle { public class Rectangle {
          
 +  // the Rectangle class has 3 fields
   private int width;   private int width;
   private int height;   private int height;
   private Point origin;   private Point origin;
          
-  // the Rectangle class has one constructor+  // the Rectangle class has two constructors
   public Rectangle(int width, int height, Point origin) {   public Rectangle(int width, int height, Point origin) {
     this.width = width;     this.width = width;
     this.height = height;     this.height = height;
-    this.origin = o;+    this.origin = origin; 
 +  } 
 +   
 +  public Rectangle(int width, int height, int xPos, int yPos) { 
 +    this(width, height, new Point(xPos, yPos)); 
 +  } 
 +     
 +  public void setWidth(int width ) { 
 +    this.width = width; 
 +  } 
 +   
 +  public int getWidth() { 
 +    return width; 
 +  } 
 +     
 +  public void setHeight(int height ) { 
 +    this.height = height; 
 +  } 
 +   
 +  public int getHeight() { 
 +    return height; 
 +  } 
 +     
 +  public void setOrigin(Point o) { 
 +    origin = o; 
 +  } 
 +   
 +  public Point getOrigin() { 
 +    return origin; 
 +  } 
 +   
 +  public int getArea() { 
 +       return width * height; 
 +  } 
 +    
 +  // Move rectangle origin by dx,dy 
 +  public void moveOrigin(int dx, int dy) { 
 +    origin.setX( origin.getX() + dx ); 
 +    origin.setY( origin.getY() + dy );
   }   }
-  ... 
 } }
 </code> </code>
  
-__O τελεστής **this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (this.variable) από μία τοπική μεταβλητή (variable) με το ίδιο όνομα. +|Προηγούμενο: [[:java:arrays Πίνακες]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|
- +
-<WRAP tip 80% center round> +
-O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε τόσο για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. Με χρήση του τελεστή **this** μπορείτε επίσης να καλέσετε και μεθόδους της κλάσης από το τρέχον αντικείμενο, πράγμα που όμως δεν θα το δείτε στην πράξη, καθώς δεν υπάρχει ανάγκη για κάτι τέτοιο. +
-</WRAP> +
- +
-|Προηγούμενο: [[:java:objectsΔημιουργώντας Αντικείμενα ]] | Επόμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|+
  
java/this_operator.txt · Last modified: 2022/02/23 16:10 by gthanos