This is an old revision of the document!
Table of Contents
Τα πεδία της κλάσης
Ονοματολογία των πεδίων (μεταβλητών) της κλάσης
Οι κανόνες ονοματολογίας των μεταβλητών στην Java συνοψίζονται στα εξής:
- Τα ονόματα των μεταβλητών είναι case-sensitive. Κάθε μεταβλητή μπορεί να ξεκινά με ένα γράμμα της αλφαβήτου (κεφαλαίο ή μικρό), τον χαρακτήρα '$' ή τον χαρακτήρα '_'. Αποφύγετε όμως οι μεταβλητές σας να ξεκινούν με τους χαρακτήρες '$' ή '_' εκτός αν συντρέχει ισχυρός λόγος.
- Οι υπόλοιποι χαρακτήρες των μεταβλητών σας μπορεί να είναι γράμματα (κεφαλαία και μικρά), αριθμοί και οι χαρακτήρες '$', '_'. Αποφύγετε στην ονοματολογία σας μεταβλητές που έχουν μόνο ένα γράμμα (π.χ. int s, double c) εκτός και εάν πρόκειται για μεταβλητές δείκτες που χρησιμοποιούνται σε ανακύκλωση (π.χ for, while).
- Αν το όνομα της μεταβλητής σας αποτελείται από μία λέξη τότε γράψτε την λέξη αυτή με μικρά γράμματα (π.χ. role, colour, speed). Εάν η μεταβλητή σας περιέχει δύο λέξεις ενώστε τις λέξεις αυτές κάνοντας το πρώτο γράμμα κάθε λέξης κεφαλαίο (π.χ. adminRole, brighterColour, maxSpeed, maxSpeedTest).
- Εάν η μεταβλητή σας ορίζεται ως σταθερά, δηλαδή χαρακτηρίζεται από το πρόθεμα static final (π.χ. static final double PI = 3.14159265359;), τότε χρησιμοποιήστε εξ ολοκλήρου κεφαλαία αντί για μικρά γράμματα.
Τύποι πεδίων της κλάσης
Μία κλάση μπορεί να διαθέτει
- primitive (βασικούς) τύπους δεδομένων (πχ. int, long, char, double, float κλπ, σε αναλογία με τους τύπους δεδομένων της γλώσσας προγραμματισμού C) και
- reference τύπους δεδομένων, δηλαδή τύπους δεδομένων οι οποίοι περιγράφονται από κλάσεις.
Βασικούς τύπους δεδομένων συναντήσαμε ήδη στην προηγούμενη σελίδα. Reference τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που προδιαγράφονται από κλάσεις. Για παράδειγμα, ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ορθογώνιου παραλληλόγραμμου που ορίσαμε στην προηγούμενη παράγραφο στον χώρο. Η θέση του παραλληλογράμμου μπορεί να προσδιοριστεί από την παρακάτω κλάση Point η οποία περιγράφει ένα σημείο στο χώρο. Θεωρήστε ότι το σημείο προσδιορίζει την κάτω αριστερή γωνία του παραλληλογράμμου στον χώρο, όπως φαίνεται στο παρακάτω σχήμα.
- Point.java
public class Point { private int x; private int y; public Point(int xPos, int yPos) { x = xPos; y = yPos; } public int getX() { return x; } public void setX(int xPos) { x = xPos; } public int getY() { return y; } public void setY(int yPos) { y = yPos; } }
Με χρήση της παραπάνω κλάσης η κλάση Rectangle
γίνεται.
- Rectangle.java
public class Rectangle { // the Rectangle class has 3 fields private int width; private int height; private Point origin; // the Rectangle class has one constructor public Rectangle(int initWidth, int initHeight, Point initOrigin) { width = initWidth; height = initHeight; origin = initOrigin; } public void setWidth(int newWidth ) { width = newWidth; } public void setHeight(int newHeight ) { height = newHeight; } public void setOrigin(Point newOrigin) { origin = newOrigin; } public void setOrigin(int newX, int newY) { origin = newOrigin; } public void setOrigin(int newX, int newY) { origin.setX(newX); origin.setY(newY); } /* // this method cannot compile as long as x,y // are declared private. public void setOrigin(int newX, int newY) { origin.x = newX; origin.y = newY; } */ }
Η κλάση Rectangle
επομένως περιέχει εκτός από primitive πεδία και ένα reference πεδίο, το πεδίο origin
.
Μεταγλωττίστε τις δύο παραπάνω κλάσεις γράφοντας
javac Point.java javac Rectangle.java
Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private
Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές public και private. Οι προσδιοριστές αυτοί αφορούν την προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου protected καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ public και private.
Όταν ένα πεδίο ή μία μέθοδος ορίζεται ως public τότε αυτό είναι προσβάσιμο από οποιαδήποτε άλλη κλάση. Όταν ένα πεδίο ή μια μέθοδος ορίζεται ως private τότε αυτό είναι προσβάσιμο μόνο εντός της κλάσης στην οποία έχει οριστεί.
Με βάση τα παραπάνω η κλάση Rectangle
δεν έχει απευθείας πρόσβαση στα πεδία x και y του αντικειμένου origin που ανήκει στην κλάση Point, καθώς τα x και y έχουν οριστεί ως private.
private int x; private int y;
Σε αυτή την περίπτωση, ο μόνος τρόπος να προσπελαστούν τα δεδομένα της κλάσης Point από την κλάση Rectangle είναι μέσω των μεθόδων
- public int getX()
- public int setX(int xPos)
- public int getY()
- public int setY(int yPos)
Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα πεδία της κλάσης Point είχαν οριστεί ως public αντί για private.
Αλλάξτε τον προσδιοριστή πρόσβασης για τα πεδία της κλάσης Point από private σε public. Βγάλτε από τα σχόλια την μέθοδο που είναι στο τέλος της κλάσης και βάλτε σε σχόλια της αμέσως προηγούμενη μέθοδο.
Απόκρυψη δεδομένων και εσωτερικής υλοποίησης
Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε τρίτες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα, συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους, τις οποίες μπορούν να καλούν οι υπόλοιπες κλάσεις προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει, χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον, ο τρόπος χρήσης της κλάσης ελέγχεται από τον προγραμματιστή-δημιουργό της που ορίζει το σύνολο των public μεθόδων της. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως information hiding.
Ακολουθώντας την παραπάνω πρακτική επαναορίστε την κλάση Rectangle, ώστε να υπακούει στον παραπάνω κανόνα, δηλαδή αλλάξτε τους προσδιοριστές πρόσβασης των πεδίων της κλάσης Rectangle από public
σε private
, ώστε να αποκλείσετε την πρόσβαση στα πεδία της κλάσης Rectangle από άλλες κλάσεις.
Για κάθε πεδίο των κλάσεων Point και Rectangle έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (γνωστές ως getters ή accessors), αλλά και συναρτήσεις για τον ορισμό ή την μεταβολή της τιμής τους (γνωστές ως setters ή mutators).
Προηγούμενο: H κλάση | Περιεχόμενα | Επόμενο: Μέθοδοι της Κλάσης |