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 [2015/01/22 09:09]
gthanos [Ο τελεστής super]
java:this_operator [2016/01/22 16:06]
gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this]
Line 1: Line 1:
-======  ​Oι τελεστές this και super ======+======  ​Ο τελεστής this ======
  
-===== Ο τελεστής this ===== +===== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this =====
- +
-==== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this ====+
  
 Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα
Line 9: Line 7:
 <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
-   ​public Rectangle(int ​x, int y) { +    ​origin ​o
-       ​width = w+  
-       ​height = h+   
-   ​+  public Rectangle(int ​setWidth, int setHeight) { 
-   ​....+    width = setWidth
 +    height = setHeight
 +  
 +  ....
 } }
 </​code>​ </​code>​
Line 30: Line 31:
 <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 ​setWidth, int setHeight, Point o) { 
-   ​ +    this(setWidthsetHeight)
-   ​public Rectangle(int ​w, int h) { +    origin = o; 
-       ​width = w+  
-       ​height = h+   
-   ​+  public Rectangle(int ​setWidth, int setHeight) { 
-   ​....+    width = setWidth
 +    height = setHeight
 +  
 +  ....
 } }
 </​code>​ </​code>​
  
-Ο τελεστής **this** ​δείχνει στο τρέχον αντικείμενο και ​χρησιμοποιείται για να προσπελαστεί ένας άλλος κατασκευαστής της ίδιας κλάσης. +__Το παραπάνω,​ είναι αποδεκτό από τον compiler της Java__. ​Ο τελεστής **this** χρησιμοποιείται για να κληθεί ​από ένα κατασκευαστή ένας άλλος κατασκευαστής της ίδιας κλάσης.
- +
-==== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this ==== +
- +
-Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα:​+
  
 +<WRAP important 80% center round>
 +Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευατή. Το παρακάτω παράδειγμα βγάζει μήνυμα λάθους από τον compiler.
 <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) { 
-   ​+    origin = o
-   ​... +    ​this(setWidth,​ setHeight);​ 
-   +     
 +  } 
 +   
 +  public Rectangle(int setWidth, int setHeight) { 
 +    ​width = setWidth
 +    height = setHeight
 +  
 +  ....
 } }
 </​code>​ </​code>​
 +</​WRAP>​
 +
 +===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή 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; +  // the Rectangle class has one constructor 
-       this.height = height; +  public Rectangle(int width, int height, Point origin) { 
-   ​+    width = width; 
-   ​...+    height = height; 
 +    ​origin = o; 
 +  ​
 +  ...
 } }
 </​code>​ </​code>​
  
-Στον παραπάνω κώδικα ​η τοπική μεταβλητή ''​origin''​ που δίνεται ως τυπική παράμετρος στον κατασκευαστήσυμπίπτει με την μεταβλητή της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή "​κρύβει"​ (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**.  +Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν ​με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή "​κρύβει"​ (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**, ως εξής:
- +
-Συμπερασματικάο τελεστής **this** δείχνει στο τρέχον αντικείμενο και χρησιμοποιείται για να προσπελαστούν δεδομένα ή μεταβλητές που ανήκουν σε αντικείμενα της κλάσης. +
- +
-<WRAP tip> +
-O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης,​ για λογαριασμό του οποίου εκτελείται. +
-</​WRAP>​ +
-===== Ο τελεστής super ===== +
- +
-Σε αναλογία με τον τελεστή **this**, ο τελεστής **super** δείχνει στο αντικείμενο της γονικής κλάσης. Προϋπόθεση για την χρήση του τελεστή **super** είναι να υφίσταται γονική κλάση μέσω της διαδικασίας της κληρονομικότητας.  +
- +
-==== Πρόσβαση στους κατασκευαστές της γονικής κλάσης μέσω του τελεστή this ==== +
- +
-Λαμβάνοντας κώδικα από το προηγούμενο παράδειγμα του ποδηλάτου έχουμε τα εξής:+
  
 <code java> <code java>
-public class MountainBike extends Bicycle ​{ +public class Rectangle ​
-  +     
-    ​// the MountainBike subclass has +  ​private int width; 
-    // one field +  ​private ​int height
-    ​public ​int seatHeight+  ​private Point origin; 
-  +    ​ 
-    // the MountainBike subclass ​has +  ​// the Rectangle class has one constructor 
-    // one constructor +  public ​Rectangle(int width, int heightPoint origin) { 
-    public ​MountainBike(int startHeight, int startCadence, +    ​this.width = width
-                        int startSpeed, int startGear) { +    ​this.height ​height
-        ​super(startCadence,​ startSpeed, startGear)+    ​this.origin ​o
-        ​seatHeight ​startHeight+  
-    ​}    +  ...
-  +
-    // the MountainBike subclass has +
-    // one method +
-    public void setHeight(int newValue) { +
-        seatHeight ​newValue+
-      ​ +
- +
 } }
 </​code>​ </​code>​
  
-H χρήση του ​τελεστή ​super χρησιμοποιείται ​για να προσπελάσει τον ​κατασκευαστή ​της γονικής κλάσης ​και να αρχικοποιήσει τις μεταβλητές που ανήκουν στην ​κλάση αυτή.+__O τελεστής **this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (this.variable) ​από μία τοπική μεταβλητή (variable) με το ίδιο όνομα
 + 
 +<WRAP tip 80% center round> 
 +τελεστής ​**this** δείχνει στο τρέχον αντικείμενο της εκάστοτε ​κλάσης, για λογαριασμό του ​οποίου εκτελείται. Με χρήση του τελεστή **this** ​μπορείτε να καλέσετε και μεθόδους της κλάσης από το τρέχον ​αντικείμενο,​ πράγμα που όμως δεν θα το δείτε ​στην ​πράξη, καθώς δεν ​υπάρχει ανάγκη για κάτι τέτοιο. 
 +</​WRAP>​
  
 +|Προηγούμενο:​ [[:​java:​objects| Δημιουργώντας Αντικείμενα ]] | Επόμενο:​ [[:​java:​static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|
  
java/this_operator.txt · Last modified: 2017/02/16 11:24 by gthanos