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 [2016/01/24 17:00] gthanos [Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this] |
java:this_operator [2016/02/19 13:19] doufexi changed constructors |
||
---|---|---|---|
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 | Στατικές μεταβλητές και μέθοδοι ]]| |