This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:this_operator [2015/02/13 14:18] gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this] |
java:this_operator [2016/01/25 09:07] gthanos |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Ο τελεστής this ====== | ====== Ο τελεστής this ====== | ||
- | ===== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this ===== | + | ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this ===== |
- | Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα | + | Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής |
<code java> | <code java> | ||
public class Rectangle { | public class Rectangle { | ||
- | private int width, height; | + | |
- | 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; | |
- | public Rectangle(int x, int y) { | + | origin = o; |
- | width = w; | + | } |
- | height = h; | + | ... |
- | } | + | |
- | .... | + | |
} | } | ||
</code> | </code> | ||
- | ως εξής | + | Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή "κρύβει" (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**, ως εξής: |
<code java> | <code java> | ||
public class Rectangle { | public class Rectangle { | ||
- | private int width, height; | + | |
- | 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 = o; |
- | height = h; | + | } |
- | } | + | ... |
- | .... | + | |
} | } | ||
</code> | </code> | ||
- | Ο τελεστής **this** δείχνει στο τρέχον αντικείμενο και χρησιμοποιείται για να προσπελαστεί ένας άλλος κατασκευαστής της ίδιας κλάσης. | + | __O τελεστής **this** υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (this.variable) από μία τοπική μεταβλητή (variable) με το ίδιο όνομα. |
- | ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this ===== | + | ===== Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this ===== |
- | Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα: | + | Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα |
<code java> | <code java> | ||
public class Rectangle { | public class Rectangle { | ||
- | private int width, height; | + | |
- | 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; |
- | + | origin = o; | |
+ | } | ||
+ | |||
+ | public Rectangle(int setWidth, int setHeight) { | ||
+ | width = setWidth; | ||
+ | height = setHeight; | ||
+ | } | ||
+ | .... | ||
} | } | ||
</code> | </code> | ||
- | Εναλλακτικά, το παραπάνω μπορεί να γραφεί ως εξής. | + | ως εξής |
<code java> | <code java> | ||
public class Rectangle { | public class Rectangle { | ||
- | private int width, height; | + | |
- | 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 setWidth, int setHeight, Point o) { |
- | } | + | this(setWidth, setHeight); |
- | ... | + | origin = o; |
+ | } | ||
+ | |||
+ | public Rectangle(int setWidth, int setHeight) { | ||
+ | width = setWidth; | ||
+ | height = setHeight; | ||
+ | } | ||
+ | .... | ||
} | } | ||
</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; | ||
+ | |||
+ | // 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> | ||
- | Συμπερασματικά, ο τελεστής **this** δείχνει στο τρέχον αντικείμενο και χρησιμοποιείται για να προσπελαστούν δεδομένα ή μεταβλητές που ανήκουν σε αντικείμενα της κλάσης. | ||
- | <WRAP tip> | + | <WRAP tip 80% center round> |
- | O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται. | + | O τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε τόσο για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. Με χρήση του τελεστή **this** μπορείτε επίσης να καλέσετε και μεθόδους της κλάσης από το τρέχον αντικείμενο, πράγμα που όμως δεν θα το δείτε στην πράξη, καθώς δεν υπάρχει ανάγκη για κάτι τέτοιο. |
</WRAP> | </WRAP> | ||
|Προηγούμενο: [[:java:objects| Δημιουργώντας Αντικείμενα ]] | Επόμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]]| | |Προηγούμενο: [[:java:objects| Δημιουργώντας Αντικείμενα ]] | Επόμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]]| | ||