java:class_fields

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Τα πεδία της κλάσης ====== ===== Ονοματολογία των πεδίων (μεταβλητών) της κλάσης ===== Οι κανόνες ονοματολογίας των μεταβλητών στην Java συνοψίζονται στα εξής: - Τα ονόματα των μεταβλητών είναι case-sensitive. Κάθε μεταβλητή μπορεί να ξεκινά με ένα γράμμα της αλφαβήτου (κεφαλαίο ή μικρό), τον χαρακτήρα '$' ή τον χαρακτήρα '_'. Αποφύγετε οι μεταβλητές σας να ξεκινούν με τους χαρακτήρες '$' ή '_' εκτός αν συντρέχει ισχυρός λόγος. - Οι υπόλοιποι χαρακτήρες των μεταβλητών σας μπορεί να είναι γράμματα (κεφαλαία και μικρά), αριθμοί και οι χαρακτήρες '$', '_'. Αποφύγετε στην ονοματολογία σας μεταβλητές που έχουν μόνο ένα γράμμα (π.χ. int s, double c) εκτός και εάν πρόκειται για μεταβλητές δείκτες που χρησιμοποιούνται σε ανακύκλωση (π.χ for, while). - Αν το όνομα της μεταβλητής σας αποτελείται από μία λέξη τότε γράψτε την λέξη αυτή με μικρά γράμματα (π.χ. role, colour, speed). Εάν η μεταβλητή σας περιέχει δύο λέξεις ενώστε τις λέξεις αυτές κάνοντας το πρώτο γράμμα κάθε λέξης κεφαλαίο (π.χ. adminRole, brighterColour, maxSpeed, maxSpeedTest). - Εάν η μεταβλητή σας ορίζεται ως σταθερά δηλ χαρακτηρίζεται από το πρόθεμα **static final** (π.χ. static final double PI = 3.14159265359; ) τότε χρησιμοποιήστε εξ ολοκλήρου κεφαλαία αντί για μικρά γράμματα. ===== Τύποι πεδίων της κλάσης ===== Μία κλάση μπορεί να διαθέτει - [[java:variables|primitive]] (βασικούς) τύπους δεδομένων (πχ. int, long, char, double, float κλπ, σε αναλογία με τους τύπους δεδομένων της γλώσσας προγραμματισμού C) και - [[java:variables|reference]] τύπους δεδομένων, δηλ τύπους δεδομένων οι οποίοι περιγράφονται από κλάσεις. Βασικούς τύπους δεδομένων συναντήσαμε ήδη στην προηγούμενη σελίδα. **Reference** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που αναφέρονται από κλάσεις. Για παράδειγμα, ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ποδηλάτου. Η θέση του ποδηλάτου μπορεί να προσδιοριστεί από την παρακάτω κλάση ''Coordinates'' που προσδιορίζει την θέση με βάση το γεωγραφικό ύψος και πλάτος. <code java Coordinates.java> public class Coordinates { private double latitude; private double longitude; public Coordinates(double lat, double log) { latitude = lat; longitude = log; } public double getLatitude() { return latitude; } public double getLongitude() { return longitude; } public void setLatitude(double lat) { latitude = lat; } public void setLongitude(double log) { longitude = log; } } </code> Με χρήση της παραπάνω κλάσης η κλάση ''Bicycle'' γίνεται. <code java Bicycle.java> public class Bicycle { public int cadence; public int gear; public int speed; public Coordinates coordinates; public Bicycle(int startCadence, int startSpeed, int startGear, double lat, double log) { coordinates = new Coordinates( lat, log); gear = startGear; cadence = startCadence; speed = startSpeed; } public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } } </code> Η κλάση ''Bicycle'' επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''coordinates''. Εδώ θα πρέπει να παρατηρήσουμε ότι στην 1η γραμμή του κατασκευαστή τη κλάσης ''Βicycle'' συναντούμε ''coordinates = new Coordinates(lat,long);''. ===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε άλλες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα, συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους, τις οποίες μπορούν να χρησιμοποιήσουν άλλοι προγραμματιστές προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει, χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον, η χρήση της κλάσης ελέγχεται από εμάς, δημιουργώντας κατά κανόνα ασφαλέστερο κώδικα. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>Information_hiding|information hiding]]**. Ακολουθώντας την παραπάνω πρακτική θα επαναορίσουμε την κλάση του ποδηλάτου, ώστε να υπακούει στον παραπάνω κανόνα. Παράλληλα θα αλλάξουμε τους [[java:class_fields#Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης από ''public'' σε ''private'', ώστε να αποκλείσουμε την πρόσβαση στα πεδία της κλάσης από εξωτερικές κλάσεις [[#Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|(δες παρακάτω)]]. <code java Bicycle.java> public class Bicycle { private int cadence; private int gear; private int speed; private Coordinates coordinates; public Bicycle(int startCadence, int startSpeed, int startGear, double lat, double log) { coordinates = new Coordinates( lat, log); gear = startGear; cadence = startCadence; speed = startSpeed; } public int getCadence() { return cadence; } public void setCadence(int newValue) { cadence = newValue; } public int getGear() { return gear; } public void setGear(int newValue) { gear = newValue; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } public Coordinates get_coordinates() { return coordinates; } public void setCoordinates(double lat, double log) { coordinates.setLatitude(lat); coordinates.setLongitude(log); } } </code> Για κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (**getters**), αλλά και συναρτήσεις για τον ορισμό η την μεταβολή της τιμής τους (**setters**). ===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private ===== Γνωρίσαμε τους προσδιοριστές τύπου **public** και **private**. Οι προσδιοριστές τύπου αφορούν την απόκρυψη της πληροφορίας στην οποία αναφερθήκαμε παραπάνω. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ **public** και **private**. Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ως **public** τότε αυτό είναι προσβάσιμο από: - άλλες κλάσεις που περιέχουν πεδία που ανήκουν στη συγκεκριμένη κλάση. Για παράδειγμα, η κλάση ''Bicycle'' περιέχει το πεδίο ''coordinates'' που είναι του τύπου ''Coordinates''. - υποκλάσεις που δημιουργούνται μέσω της διαδικασίας κληρονομικότητας και βασίζονται στην αρχική κλάση. Για παράδειγμα, αν οριστεί η κλάση ''MountainBike'' όπως παρακάτω <code java> public class MountainBike extends Bicycle { } </code> τότε η κλάση ''MountainBike'' θα έχει απευθείας πρόσβαση στον πεδίο ''coordinates'' της γονικής της κλάσης. Κάτι τέτοιο δεν ισχύει για τα πεδία ''cadence'', ''gear'', ''speed'' τα οποία έχουν οριστεί ως **private**. Τα πεδία αυτά μπορούν να //προσπελαστούν// μόνο μέσα από τις βοηθητικές συναρτήσεις (setXXX και getXXX) που έχουν οριστεί ως **public** για πρόσβαση στα πεδία αυτά. |Προηγούμενο: [[:java:class| H κλάση ]] | Επόμενο: [[:java:class_methods | Μέθοδοι της Κλάσης ]]|

java/class_fields.1442582897.txt.gz · Last modified: 2016/02/26 11:15 (external edit)