====== Ο τελεστής this ====== Μέσω του τελεστή **this** μπορούμε: * να έχουμε πρόσβαση στα πεδία του τρέχοντος αντικειμένου όταν υπάρχουν και τοπικές μεταβλητές που έχουν το ίδιο όνομα με το αντικείμενο. * κατά τη δημιουργία του αντικειμένου να καλέσουμε ένα κατασκευαστή μέσω ενός άλλου κατασκευαστή. ===== Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης με χρήση του τελεστή this ===== Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής public class Rectangle { private int width; private int height; private Point origin; // the Rectangle class has one constructor public Rectangle(int width, int height, Point origin) { width = width; height = height; origin = origin; } ... } Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή/παράμετρος "κρύβει" (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή **this**, ως εξής: public class Rectangle { private int width; private int height; private Point origin; // the Rectangle class has one constructor public Rectangle(int width, int height, Point origin) { this.width = width; this.height = height; this.origin = origin; } ... } __O τελεστής this υποδεικνύει το τρέχον αντικείμενο__. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητή του τρέχοντος αντικειμένου (της μορφής **this.**//variable//) από μία τοπική μεταβλητή (//variable//) με το ίδιο όνομα. ===== Κλήση ενός κατασκευαστή μέσω άλλου κατασκευαστή με χρήση του τελεστή this ===== Ας ξαναδούμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα θέλοντας να επιχειρήσουμε να επαναχρησιμοποιήσουμε τμήματα κώδικα ενός κατασκευαστή από έναν άλλο κατασκευαστή. class Rectangle { int width; int height; Point origin; Rectangle(int initWidth, int initHeight, Point initOrigin) { width = initWidth; height = initHeight; origin = initOrigin; } Rectangle(int initWidth, int initHeight, int xPos, int yPos) { width = initWidth; height = initHeight; origin = new Point(xPos,yPos); } .... } Ιδανικά θα θέλαμε να καλέσουμε έναν κατασκευαστή μέσα από έναν άλλο κατασκευαστή. Στη Java αυτό είναι εφικτό με χρήση του τελεστή **this**, ως εξής: class Rectangle { int width; int height; Point origin; Rectangle(int initWidth, int initHeight, Point initOrigin) { width = initWidth; height = initHeight; origin = initOrigin; } Rectangle(int initWidth, int initHeight, int xPos, int yPos) { this(initWidth, initHeight, new Point(xPos,yPos)); } .... } Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευαστή. Αν δεν το κάνετε και προηγηθεί μία άλλη εντολή πριν την κλήση του κατασκευαστή θα λάβετε ένα μήνυμα λάθους από τον compiler. Ενδεικτικό είναι το παρακάτω παράδειγμα: class Rectangle { int width; int height; Point origin; Rectangle(int width, int height, Point origin) { this.origin = origin; /* η κλήση ενός κατασκευαστή μέσα από άλλο * κατασκευαστή, χωρίς να είναι 1η εντολή * παράγει μήνυμα λάθους από τον compiler. */ this(width, height); } Rectangle(int width, int height) { this.width = width; this.height = height; } .... } /* Συμπερασματικά, τελεστής **this** δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε * για να διακρίνεται τα πεδία του τρέχοντος αντικειμένου σε σχέση με τοπικές μεταβλητές που έχουν το ίδιο όνομα με τα πεδία αυτά. * να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. */ Παρακάτω, μπορείτε να δείτε την κλάση **Rectangle**, όπως διαμορφώνεται με χρήση του τελεστή **this** τόσο για την κλήση ενός κατασκευαστή της κλάσης από άλλο, όσο για την πρόσβαση στα πεδία της κλάσης όταν αυτά επισκιάζονται από τοπικές μεταβλητές ή παραμέτρους μεθόδων με το ίδιο όνομα. class Rectangle { // the Rectangle class has 3 fields int width; int height; Point origin; // the Rectangle class has two constructors Rectangle(int width, int height, Point origin) { this.width = width; this.height = height; this.origin = origin; } Rectangle(int width, int height, int xPos, int yPos) { this(width, height, new Point(xPos, yPos)); } void setWidth(int width ) { this.width = width; } int getWidth() { return width; } void setHeight(int height ) { this.height = height; } int getHeight() { return height; } void setOrigin(Point o) { origin = o; } Point getOrigin() { return origin; } int getArea() { return width * height; } // Move rectangle origin by dx,dy void moveOrigin(int dx, int dy) { origin.setX( origin.getX() + dx ); origin.setY( origin.getY() + dy ); } } |Προηγούμενο: [[:java:arrays | Πίνακες]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:static_keyword | Στατικές μεταβλητές και μέθοδοι ]]|