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
Next revision Both sides next revision
java:class_fields [2016/01/22 14:37]
gthanos [Απόκρυψη δεδομένων και εσωτερικής υλοποίησης]
java:class_fields [2016/02/26 11:15]
127.0.0.1 external edit
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;​)τότε χρησιμοποιήστε εξ ολοκλήρου κεφαλαία αντί για μικρά γράμματα.
  
 ===== Τύποι πεδίων της κλάσης ===== ===== Τύποι πεδίων της κλάσης =====
Line 14: Line 14:
 Μία κλάση μπορεί να διαθέτει ​ Μία κλάση μπορεί να διαθέτει ​
   - [[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** ​η η οποία περιγράφει ένα σημείο στο χώρο. Θεωρήστε ότι το σημείο προσδιορίζει την κάτω αριστερή γωνία του παραλληλογράμμου στον χώρο, όπως φαίνεται στο παρακάτω σχήμα.+Βασικούς τύπους δεδομένων συναντήσαμε ήδη στην προηγούμενη σελίδα. **Reference** τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που προδιαγράφονται από κλάσεις. Για παράδειγμα,​ ας πούμε ότι στο παραπάνω παράδειγμα θέλουμε να προσθέσουμε την θέση του ορθογώνιου παραλληλόγραμμου που ορίσαμε στην προηγούμενη παράγραφο στον χώρο. Η θέση του παραλληλογράμμου μπορεί να προσδιοριστεί από την παρακάτω κλάση **Point** η οποία περιγράφει ένα σημείο στο χώρο. Θεωρήστε ότι το σημείο προσδιορίζει την κάτω αριστερή γωνία του παραλληλογράμμου στον χώρο, όπως φαίνεται στο παρακάτω σχήμα.
  
-{{:​java:​rectangle-origin.png?​300|}}+{{  :​java:​rectangle-origin.png?​350  ​ }}
  
 <code java Point.java>​ <code java Point.java>​
Line 57: Line 57:
   public int width;   public int width;
   public int height;   public int height;
-  public int[] color;// (in rgb format) 
   public 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+
   public void setWidth(int newWidth ) {   public void setWidth(int newWidth ) {
     width = newWidth;     width = newWidth;
Line 77: Line 74:
   }   }
     ​     ​
-  public void setColor(int[] setColor) { +  public void setOrigin(Point newOrigin) { 
-    ​color setColor+    ​origin ​newOrigin
-  } +  }    ​
-   +
-  public String toString() { +
-    return "​Width:​ "​+width+",​ Height: "​+height+",​ RGB: (0x"​+Integer.toHexString(color[0])+",​ 0x"​+Integer.toHexString(color[1])+",​ 0x"​+Integer.toHexString(color[0])+"​)";​ +
-  } +
-   +
-  public static void main(String args[]) { +
-    int[] color = new int[3]; +
-    color[0] = color[1] = color[2] =255; +
-    Rectangle rect = new Rectangle( 100, 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 ===== ===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private =====
Line 101: Line 86:
 Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές **public** και **private**. Οι προσδιοριστές αυτοί αφορούν την προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ **public** και **private**. Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές **public** και **private**. Οι προσδιοριστές αυτοί αφορούν την προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ **public** και **private**.
  
-Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ως **public** τότε αυτό είναι προσβάσιμο από:+Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ως **public** τότε αυτό είναι προσβάσιμο από ​οποιαδήποτε άλλη κλάση. Όταν ένα πεδίο ή μια μέθοδος ορίζεται ως **private** τότε αυτό είναι προσβάσιμο μόνο εντός της κλάσης στην οποία έχει οριστεί. /*:
   - άλλες κλάσεις που περιέχουν πεδία που ανήκουν στη συγκεκριμένη κλάση. Για παράδειγμα,​ η κλάση ''​Rectangle''​ περιέχει το πεδίο ''​origin''​ που είναι του τύπου ''​Point''​.   - άλλες κλάσεις που περιέχουν πεδία που ανήκουν στη συγκεκριμένη κλάση. Για παράδειγμα,​ η κλάση ''​Rectangle''​ περιέχει το πεδίο ''​origin''​ που είναι του τύπου ''​Point''​.
-  - [[java:​inheritance|υποκλάσεις]] που δημιουργούνται μέσω της διαδικασίας κληρονομικότητας και βασίζονται στην αρχική κλάση (//θα δούμε παρακάτω την έννοια της κληρονομικότητας//​)+  - [[java:​inheritance|υποκλάσεις]] που δημιουργούνται μέσω της διαδικασίας κληρονομικότητας και βασίζονται στην αρχική κλάση (//θα δούμε παρακάτω την έννοια της κληρονομικότητας//​) ​*/
  
 Με βάση τα παραπάνω η κλάση ''​Rectangle''​ δεν ​ έχει απευθείας πρόσβαση στα πεδία **x** και **y** του αντικειμένου **origin** που ανήκει στην κλάση **Point**, καθώς τα **x** και **y** έχουν οριστεί ως **private**. Με βάση τα παραπάνω η κλάση ''​Rectangle''​ δεν ​ έχει απευθείας πρόσβαση στα πεδία **x** και **y** του αντικειμένου **origin** που ανήκει στην κλάση **Point**, καθώς τα **x** και **y** έχουν οριστεί ως **private**.
Line 117: Line 102:
   * public int setY(int yPos)   * public int setY(int yPos)
  
-Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα δεδομένα είχαν οριστεί ως **public** αντί για **private**.+Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα δεδομένα είχαν οριστεί ως **public** αντί για **private**. ​
  
 ===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== ===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης =====
Line 123: Line 108:
 Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε τρίτες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα,​ συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους,​ τις οποίες μπορούν να καλούν οι υπόλοιπες κλάσεις προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει,​ χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον,​ ο τρόπος χρήσης της κλάσης ελέγχεται από τον προγραμματιστή που ορίζει το σύνολο των παρεχόμενων μεθόδων,​ δημιουργώντας κατά κανόνα ασφαλέστερο κώδικα. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>​Information_hiding|information hiding]]**.  ​ Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων σε τρίτες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα,​ συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους,​ τις οποίες μπορούν να καλούν οι υπόλοιπες κλάσεις προκειμένου να χρησιμοποιήσουν την κλάση μας. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει,​ χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον,​ ο τρόπος χρήσης της κλάσης ελέγχεται από τον προγραμματιστή που ορίζει το σύνολο των παρεχόμενων μεθόδων,​ δημιουργώντας κατά κανόνα ασφαλέστερο κώδικα. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>​Information_hiding|information hiding]]**.  ​
  
-Ακολουθώντας την παραπάνω πρακτική θα επαναορίσουμε την κλάση του ορθογωνίου παραλληλογράμμου,​ ώστε να υπακούει στον παραπάνω κανόνα. Παράλληλα θα αλλάξουμε τους [[java:​class_fields#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης από ''​public''​ σε ''​private'',​ ώστε να αποκλείσουμε την πρόσβαση στα πεδία της κλάσης από εξωτερικές κλάσεις [[#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|(δες παρακάτω)]].+Ακολουθώντας την παραπάνω πρακτική θα επαναορίσουμε την κλάση του ορθογωνίου παραλληλογράμμου,​ ώστε να υπακούει στον παραπάνω κανόνα. Παράλληλα θα αλλάξουμε τους [[java:​class_fields#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης από ''​public''​ σε ''​private'',​ ώστε να αποκλείσουμε την πρόσβαση στα πεδία της κλάσης από εξωτερικές κλάσεις [[#​Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|(δες παραπάνω)]].
  
 <code java Rectangle.java>​ <code java Rectangle.java>​
Line 132: Line 117:
   private int width;   private int width;
   private int height;   private int height;
-  private int[] color;// (in rgb format) 
   private Point origin;   private Point origin;
     ​     ​
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
-  public Rectangle(int ​setWidth, int setHeight, int[] setColor, Point o) { +  public Rectangle(int ​initWidth, int initHeight, Point initOrigin) { 
-    width = setWidth+    width = initWidth
-    height = setHeight;​ +    height = initHeight
-    color = setColor+    origin = initOrigin;
-    origin = o;+
   }   }
-     +
-  // the Rectangel class has 3 methods+
   public void setWidth(int newWidth ) {   public void setWidth(int newWidth ) {
     width = newWidth;     width = newWidth;
Line 160: Line 142:
   }   }
     ​     ​
-  public void setColor(int[] setColor) { +  public void setOrigin(Point newOrigin) { 
-    ​color setColor;+    ​origin ​newOrigin;
   }   }
   ​   ​
-  public ​int[] getColor() { +  public Point getOrigin() {
-    return color; +
-  } +
-   +
-  public void setPoint(Point o) { +
-    origin = o; +
-  } +
-   +
-  public Point getPoint() {+
     return origin;     return origin;
   }   }
   ​   ​
-  public String toString() { 
-    return "​Origin Point: ("​+origin.getX()+","​+origin.getY()+"​),​ Width: "​+width+",​ Height: "​+height+ 
-    ", RGB: (0x"​+Integer.toHexString(color[0])+",​ 0x"​+Integer.toHexString(color[1])+ 
-    ", 0x"​+Integer.toHexString(color[0])+"​)";​ 
-  }    ​ 
 } }
 </​code>​ </​code>​
  
-Για κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (**getters**),​ αλλά και συναρτήσεις για τον ορισμό ​η την μεταβολή της τιμής τους (**setters**).+Για κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (γνωστές ως **getters** ή **accessors**), αλλά και συναρτήσεις για τον ορισμό ​ή την μεταβολή της τιμής τους (γνωστές ως **setters** ή **mutators**).
  
-|Προηγούμενο:​ [[:​java:​class| H κλάση ]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|+|Προηγούμενο:​ [[:​java:​class| H κλάση ​]] | [[:toc | Περιεχόμενα ​]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|
  
  
java/class_fields.txt · Last modified: 2020/02/20 14:25 by gthanos