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 [2016/01/22 14:25]
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** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που προδιαγράφονται από κλάσεις. Για παράδειγμα,​ ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ορθογώνιου παραλληλόγραμμου που ορίσαμε στην προηγούμενη παράγραφο στον χώρο. Η θέση του παραλληλογράμμου μπορεί να προσδιοριστεί από την παρακάτω κλάση **Point** ​η η οποία περιγράφει ένα σημείο στο χώρο. Θεωρήστε ότι το σημείο προσδιορίζει την κάτω αριστερή γωνία του παραλληλογράμμου στον χώρο, όπως φαίνεται στο παρακάτω σχήμα.+Βασικούς τύπους δεδομένων συναντήσαμε στην ​[[java:​class|κλάση Rectangle της ​προηγούμενης σελίδας]]. **Reference** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που προδιαγράφονται από κλάσεις. Για παράδειγμα,​ ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ορθογώνιου παραλληλόγραμμου που ορίσαμε στην προηγούμενη παράγραφο στον χώρο. Η θέση του παραλληλογράμμου μπορεί να προσδιοριστεί από την παρακάτω κλάση **Point** η οποία περιγράφει ένα σημείο στο χώρο. Θεωρήστε ότι το σημείο προσδιορίζει την κάτω αριστερή γωνία του παραλληλογράμμου στον χώρο, όπως φαίνεται στο παρακάτω σχήμα.
  
-{{:​java:​rectangle-origin.png?​300|}}+{{  :​java:​rectangle-origin.png?​350  ​ }}
  
 <code java Point.java>​ <code java Point.java>​
- +class Point { 
-public ​class Point { +  int x;   // x coordinate 
-    ​private ​int x; +  int y;   // y coordinate 
-    ​private ​int y; +   
-     +  public Point(int xPos, int yPos) { 
-    public Point(int xPos, int yPos) { +    x = xPos; 
-      x = xPos; +    y = yPos; 
-      y = yPos; +  
-    +   
-     +  int getX() { 
-    ​public ​int getX() { +    return x; 
-      return x; +  
-    +   
-     +  void setX(int xPos) { 
-    ​public ​void setX(int xPos) { +    x = xPos; 
-      x = xPos; +  
-    +   
-     +  int getY() { 
-    ​public ​int getY() { +    return y; 
-      return y; +  
-    +   
-     +  void setY(int yPos) { 
-    ​public ​void setY(int yPos) { +    y = yPos; 
-      y = yPos; +  }
-    }+
 } }
 </​code>​ </​code>​
Line 52: Line 51:
  
 <code java Rectangle.java>​ <code java Rectangle.java>​
-public ​class Rectangle {+class Rectangle {
     ​     ​
   // the Rectangle class has 3 fields   // the Rectangle class has 3 fields
-  ​public ​int width; +  int width; 
-  ​public ​int height; +  int height; 
-  ​public int[] color;// (in rgb format) +  Point origin;
-  public ​Point origin;+
     ​     ​
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
-  public Rectangle(int ​setWidth, int setHeightint[] setColor, int X, int Y) { +  public Rectangle(int ​initWidth, int initHeightPoint initOrigin) { 
-    width = setWidth+    width = initWidth
-    height = setHeight;​ +    height = initHeight
-    color = setColor+    origin = initOrigin;
-    origin = new Point(X,Y);+
   }   }
-    ​ + 
-  ​// the Rectangel class has 3 methods +  void setWidth(int newWidth ) {
-  public ​void setWidth(int newWidth ) {+
     width = newWidth;     width = newWidth;
   }   }
     ​     ​
-  ​public ​void setHeight(int newHeight ) {+  void setHeight(int newHeight ) {
     height = newHeight;     height = newHeight;
   }   }
     ​     ​
-  ​public ​void setColor(int[] setColor) { +  void setOrigin(Point newOrigin) { 
-    ​color setColor;+    ​origin ​newOrigin;
   }   }
   ​   ​
-  ​public String toString() { +  ​Point getOrigin() { 
-    return ​"​Width:​ "​+width+",​ Height: "​+height+",​ RGB: (0x"​+Integer.toHexString(color[0])+",​ 0x"​+Integer.toHexString(color[1])+",​ 0x"​+Integer.toHexString(color[0])+"​)"​;+    return ​origin;
   }   }
   ​   ​
-  ​public static ​void main(String args[]) { +  void setOrigin(int newX, int newY) { 
-    ​int[] color = new int[3]; +    ​origin.setX(newX); 
-    color[0] = color[1] = color[2] =255; +    ​origin.setY(newY);
-    Rectangle rect = new Rectangle100, 200, color, 10, 20); +
-    ​System.out.println(rect);+
   }   }
-     +}
-+
 </​code>​ </​code>​
  
-Η κλάση ''​Rectangle''​ επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''​origin''​. Εδώ θα πρέπει να παρατηρήσουμε ότι στην 4η γραμμή του κατασκευαστή τη κλάσης ''​Rectangle''​ συναντούμε την εντολή ''​origin = new Point(X,​Y);''​. Σε αυτό το σημείο ο κατασκευαστής της κλάσης **Rectangle** καλεί τον κατασκευαστή της κλάσης **Point** προκειμένου να δημιουργήσει ένα αντικείμενο τύπου **Point**. Το αντικείμενο αυτό, όπως προαναφέραμε ανήκει στην κλάση **Rectangle**.+Η κλάση ''​Rectangle''​ επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''​origin''​.
  
-===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private ===== +<WRAP todo 80% center round> 
- +Μεταγλωττίστε τις δύο παραπάνω κλάσεις στο τερματικό σας, γράφοντας 
-Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές **public** και **private**. Οι προσδιοριστές αυτοί αφορούν την προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος ​από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ **public** και **private**. +<​code>​ 
- +javac Point.java 
-Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ​ως **public** τότε αυτό είναι προσβάσιμο από: +javac Rectangle.java
-  - άλλες ​κλάσεις ​που περιέχουν πεδία που ανήκουν ​στη συγκεκριμένη κλάση. Για παράδειγμα,​ η κλάση ''​Rectangle''​ περιέχει ​το πεδίο ''​origin''​ που είναι ​του τύπου ''​Point''​. +
-  - [[java:​inheritance|υποκλάσεις]] που δημιουργούνται μέσω ​της διαδικασίας κληρονομικότητας και βασίζονται στην αρχική κλάση (//θα δούμε παρακάτω την έννοια της κληρονομικότητας//​) +
- +
-Με βάση τα παραπάνω η κλάση ''​Rectangle''​ δεν ​ έχει απευθείας πρόσβαση στα πεδία **x** και **y** του αντικειμένου **origin** που ​ανήκει στην κλάση **Point**, καθώς τα **x** και **y** έχουν οριστεί ως **private**. +
-<​code ​java+
-  ​private int x; +
-  ​private int y;+
 </​code>​ </​code>​
 +</​WRAP>​
  
-Σε αυτή την περίπτωση,​ ο μόνος τρόπος να προσπελαστούν τα δεδομένα της κλάσης **Point** είναι μέσω των μεθόδων  +|Προηγούμενο[[:java:classκλάση ]] [[:toc Περιεχόμενα ]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|
-  * public int getX() +
-  * public int setX(int xPos) +
-  * public int getY() +
-  * public int setY(int yPos) +
- +
-Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα δεδομένα είχαν οριστεί ως **public** αντί για **private**. +
- +
-===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== +
- +
-Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς ​Προγραμματισμούς είναι ​η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε τρίτες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα,​ συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους,​ τις οποίες μπορούν να καλούν οι υπόλοιπες κλάσεις προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει,​ χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον,​ ο τρόπος χρήσης της κλάσης ελέγχεται από τον προγραμματιστή που ορίζει το σύνολο των παρεχόμενων μεθόδων,​ δημιουργώντας κατά κανόνα ασφαλέστερο κώδικα. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>​Information_hiding|information hiding]]**. ​  +
- +
-Ακολουθώντας την παραπάνω πρακτική θα επαναορίσουμε την κλάση του ορθογωνίου παραλληλογράμμου,​ ώστε να υπακούει στον παραπάνω κανόνα. Παράλληλα θα αλλάξουμε τους [[java:​class_fields#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης από ''​public''​ σε ''​private'',​ ώστε να αποκλείσουμε την πρόσβαση στα πεδία της κλάσης από εξωτερικές κλάσεις ​[[#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|ες παρακάτω)]]. +
- +
-<code java Rectangle.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**). +
- +
-|Προηγούμενο:​ [[:​java:​class| H κλάση ​]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|+
  
  
java/class_fields.1453472728.txt.gz · Last modified: 2016/02/26 11:15 (external edit)