java:class_fields

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:class_fields [2015/09/18 13:29]
gthanos
java:class_fields [2020/02/20 14:25] (current)
gthanos
Line 5: Line 5:
 Οι κανόνες ονοματολογίας των μεταβλητών στην Java συνοψίζονται στα εξής: Οι κανόνες ονοματολογίας των μεταβλητών στην Java συνοψίζονται στα εξής:
  
-  - Τα ονόματα των μεταβλητών είναι case-sensitive. Κάθε μεταβλητή μπορεί να ξεκινά με ένα γράμμα της αλφαβήτου (κεφαλαίο ή μικρό),​ τον χαρακτήρα '​$'​ ή τον χαρακτήρα '​_'​. Αποφύγετε οι μεταβλητές σας να ξεκινούν με τους χαρακτήρες '​$'​ ή '​_'​ εκτός αν συντρέχει ισχυρός λόγος. +  - Τα ονόματα των μεταβλητών είναι case-sensitive. Κάθε μεταβλητή μπορεί να ξεκινά με ένα γράμμα της αλφαβήτου (κεφαλαίο ή μικρό),​ τον χαρακτήρα '​$'​ ή τον χαρακτήρα '​_'​. ​//Αποφύγετε ​όμως ​οι μεταβλητές σας να ξεκινούν με τους χαρακτήρες '​$'​ ή '​_'​ εκτός αν συντρέχει ισχυρός λόγος//
-  - Οι υπόλοιποι χαρακτήρες των μεταβλητών σας μπορεί να είναι γράμματα (κεφαλαία και μικρά),​ αριθμοί και οι χαρακτήρες '​$',​ '​_'​. Αποφύγετε στην ονοματολογία σας μεταβλητές που έχουν μόνο ένα γράμμα (π.χ. int s, double c) εκτός και εάν πρόκειται για μεταβλητές δείκτες που χρησιμοποιούνται σε ανακύκλωση (π.χ for, while).+  - Οι υπόλοιποι χαρακτήρες των μεταβλητών σας μπορεί να είναι γράμματα (κεφαλαία και μικρά),​ αριθμοί και οι χαρακτήρες '​$',​ '​_'​. ​//Αποφύγετε στην ονοματολογία σας μεταβλητές που έχουν μόνο ένα γράμμα (π.χ. int s, double c) εκτός και εάν πρόκειται για μεταβλητές δείκτες που χρησιμοποιούνται σε επανάληψη (π.χ for, while)//.
   - Αν το όνομα της μεταβλητής σας αποτελείται από μία λέξη τότε γράψτε την λέξη αυτή με μικρά γράμματα (π.χ. role, colour, speed). Εάν η μεταβλητή σας περιέχει δύο λέξεις ενώστε τις λέξεις αυτές κάνοντας το πρώτο γράμμα κάθε λέξης κεφαλαίο (π.χ. adminRole, brighterColour,​ maxSpeed, maxSpeedTest).   - Αν το όνομα της μεταβλητής σας αποτελείται από μία λέξη τότε γράψτε την λέξη αυτή με μικρά γράμματα (π.χ. role, colour, speed). Εάν η μεταβλητή σας περιέχει δύο λέξεις ενώστε τις λέξεις αυτές κάνοντας το πρώτο γράμμα κάθε λέξης κεφαλαίο (π.χ. adminRole, brighterColour,​ maxSpeed, maxSpeedTest).
-  - Εάν η μεταβλητή σας ορίζεται ως σταθερά δηλ χαρακτηρίζεται από το πρόθεμα **static final** (π.χ. static final double PI = 3.14159265359;​ ) τότε χρησιμοποιήστε εξ ολοκλήρου κεφαλαία αντί για μικρά γράμματα.+  - Εάν η μεταβλητή σας ορίζεται ως σταθεράδηλαδή ​χαρακτηρίζεται από το πρόθεμα **static final** (π.χ. static final double PI = 3.14159265359;​)τότε χρησιμοποιήστε εξ ολοκλήρου κεφαλαία αντί για μικρά γράμματα.
  
 ===== Τύποι πεδίων της κλάσης ===== ===== Τύποι πεδίων της κλάσης =====
  
 Μία κλάση μπορεί να διαθέτει ​ Μία κλάση μπορεί να διαθέτει ​
-  - [[java:​variables|primitive]] (βασικούς) τύπους δεδομένων (πχ. int, long, char, double, float κλπ, σε αναλογία με τους τύπους δεδομένων της γλώσσας προγραμματισμού C) και  +  - **[[java:​variables|primitive]] (βασικούς) τύπους δεδομένων:** (πχ. int, long, char, double, float κλπ, σε αναλογία με τους τύπους δεδομένων της γλώσσας προγραμματισμού C) και  
-  - [[java:​variables|reference]] τύπους δεδομένων, δηλ ​τύπους δεδομένων οι οποίοι περιγράφονται από κλάσεις. ​+  - **[[java:​variables|reference]] τύπους δεδομένων**: σύνθετους ​τύπους δεδομένων οι οποίοι περιγράφονται από κλάσεις. ​
  
-Βασικούς τύπους δεδομένων συναντήσαμε ​ήδη ​στην προηγούμενη σελίδα. **Reference** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που αναφέρονται από κλάσεις. Για παράδειγμα,​ ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ​ποδηλάτου. Η θέση του ποδηλάτου μπορεί να προσδιοριστεί από την παρακάτω κλάση ​''​Coordinates'' ​που προσδιορίζει την ​θέση με βάση το γεωγραφικό ύψος και πλάτος.+Βασικούς τύπους δεδομένων συναντήσαμε στην ​[[java:​class|κλάση Rectangle της ​προηγούμενης σελίδας]]. **Reference** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που ​προδιαγράφονται από κλάσεις. Για παράδειγμα,​ ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ορθογώνιου παραλληλόγραμμου που ορίσαμε στην προηγούμενη παράγραφο στον χώρο. Η θέση του παραλληλογράμμου μπορεί να προσδιοριστεί από την παρακάτω κλάση ​**Point** η οποία περιγράφει ένα σημείο στο χώρο. Θεωρήστε ότι το σημείο ​προσδιορίζει την ​κάτω αριστερή γωνία του παραλληλογράμμου στον χώρο, όπως φαίνεται στο ​παρακάτω σχήμα.
  
-<code java Coordinates.java>​ +{{  :java:​rectangle-origin.png?​350 ​ |  }}
-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) { +<code java Point.java>​ 
-        ​cadence ​newValue+class Point { 
-    } +  int x;   // x coordinate 
-         +  int y;   // y coordinate 
-    ​public void setGear(int newValue) { +   
-        gear = newValue+  ​public ​Point(int xPos, int yPos) { 
-    +    ​x ​xPos
-         +    ​y = yPos; 
-    ​public ​void applyBrake(int decrement) { +  ​
-        speed -decrement+   
-    +  int getX() { 
-         +    ​return x
-    ​public ​void speedUp(int increment) { +  
-        speed +increment+   
-    } +  void setX(int xPos) { 
-        ​+    ​x ​xPos
 +  
 +   
 +  int getY() { 
 +    ​return y; 
 +  } 
 +   
 +  ​void setY(int yPos) { 
 +    ​y ​yPos
 +  }
 } }
 </​code>​ </​code>​
  
-Η κλάση ''​Bicycle''​ επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''​coordinates''​. Εδώ θα πρέπει να παρατηρήσουμε ότι στην 1η γραμμή του ​κατασκευαστή τη κλάσης ''​Βicycle'' ​συναντούμε ''​coordinates = new Coordinates(lat,​long);''​.+Με χρήση της παραπάνω κλάσης η κλάση ''​Rectangle'' ​γίνεται.
  
-===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης ​public ​και private =====+<code java Rectangle.java>​ 
 +class Rectangle { 
 +     
 +  // the Rectangle class has 3 fields 
 +  int width; 
 +  int height; 
 +  Point origin; 
 +     
 +  // the Rectangle class has one constructor 
 +  ​public ​Rectangle(int initWidth, int initHeight, Point initOrigin) { 
 +    width initWidth;​ 
 +    height ​initHeight;​ 
 +    origin ​initOrigin;​ 
 +  }
  
-Γνωρίσαμε τους προσδιοριστές τύπου **public** και **private**. Οι προσδιοριστές τύπου αφορούν την απόκρυψη της πληροφορίας στην οποία αναφερθήκαμε παραπάνω. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ **public** και **private**. +  void setWidth(int newWidth ) { 
- +    width = newWidth; 
-Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ως **public** τότε αυτό είναι προσβάσιμο από: +  } 
-  ​- άλλες κλάσεις που περιέχουν πεδία που ανήκουν στη συγκεκριμένη κλάση. Για παράδειγμα,​ η κλάση ''​Bicycle''​ περιέχει το πεδίο ''​coordinates''​ που είναι του τύπου ''​Coordinates''​. +    ​ 
-  ​- υποκλάσεις που δημιουργούνται μέσω της διαδικασίας κληρονομικότητας και βασίζονται στην αρχική κλάση. Για παράδειγμα,​ αν οριστεί η κλάση ''​MountainBike''​ όπως παρακάτω +  ​void setHeight(int newHeight ) { 
- +    height = newHeight; 
-<​code ​ java> +  ​} 
-public class MountainBike extends Bicycle ​{+     
 +  ​void setOrigin(Point newOrigin) { 
 +    ​origin = newOrigin;​ 
 +  } 
 +   
 +  Point getOrigin() ​{ 
 +    return origin; 
 +  } 
 +   
 +  void setOrigin(int newX, int newY) { 
 +    origin.setX(newX);​ 
 +    origin.setY(newY);​ 
 +  }
 } }
 </​code>​ </​code>​
  
-τότε η κλάση ''​MountainBike'' ​θα έχει απευθείας πρόσβαση στον πεδίο ''​coordinates''​ της γονικής της κλάσης. Κάτι τέτοιο δεν ισχύει για τα πεδία ''​cadence'',​ ''​gear'',​ ''​speed'' ​τα οποία έχουν οριστεί ως **private**. Τα πεδία αυτά μπορούν να //​προσπελαστούν//​ μόνο μέσα από τις βοηθητικές συναρτήσεις (setXXX και getXXX) που έχουν οριστεί ως **public** για ​πρόσβαση στα πεδία αυτά.+Η κλάση ''​Rectangle''​ επομένως περιέχει εκτός από **primitive** πεδία ​και ένα **reference** πεδίο, ​το πεδίο ''​origin''​.
  
-===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== +<WRAP todo 80% center round> 
- +Μεταγλωττίστε τις δύο παραπάνω κλάσεις στο τερματικό σας, γράφοντας 
-Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και ​της εσωτερικής υλοποίησης των κλάσεων σε άλλες κλάσεις που ​τις ​χρησιμοποιούν. Κατά κανόνα,​ συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους, τις οποίες μπορούν να χρησιμοποιήσουν άλλοι προγραμματιστές προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών ​μεθόδων ​αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει,​ χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον,​ η χρήση της κλάσης ελέγχεται από εμάς, δημιουργώντας κατά κανόνα ασφαλέστερο κώδικα. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>​Information_hiding|information hiding]]**. ​  +<​code>​ 
- +javac Point.java 
-Ακολουθώντας ​την παραπάνω πρακτική θα επαναορίσουμε την κλάση του ποδηλάτου,​ ώστε να υπακούει στον παραπάνω κανόνα. Παράλληλα θα αλλάξουμε τους [[java:​class_fields#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης από ''​public''​ σε ''​private'',​ ώστε να αποκλείσουμε την πρόσβαση στα πεδία της κλάσης από εξωτερικές κλάσεις [[#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|(δες παρακάτω)]]. +javac Rectangle.java
- +
-<​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>​ </​code>​
 +</​WRAP>​
  
-Για κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (**getters**),​ αλλά και συναρτήσεις για τον ορισμό η την μεταβολή της τιμής τους (**setters**). +|Προηγούμενο:​ [[:​java:​class| H κλάση ​]] | [[:toc | Περιεχόμενα ​]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|
- +
-|Προηγούμενο:​ [[:​java:​class| H κλάση ]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|+
  
  
java/class_fields.1442582963.txt.gz · Last modified: 2016/02/26 11:15 (external edit)