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/02/18 12:57]
doufexi changed parameter names, rewrote public/private explanation, added toc link
java:class_fields [2020/02/20 14:25] (current)
gthanos
Line 6: Line 6:
  
   - Τα ονόματα των μεταβλητών είναι 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 13: Line 13:
  
 Μία κλάση μπορεί να διαθέτει ​ Μία κλάση μπορεί να διαθέτει ​
-  - [[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; +
-    ​+
-     +
-    public int getX() { +
-      return x; +
-    } +
-     +
-    public void setX(int xPos) { +
-      ​x = xPos; +
-    ​+
-     +
-    public int getY() { +
-      return y; +
-    } +
-     +
-    public void setY(int yPos) { +
-      ​y = yPos+
-    } +
-+
-</​code>​ +
- +
-Με χρήση της παραπάνω κλάσης η κλάση ''​Rectangle''​ γίνεται. +
- +
-<code java Rectangle.java>​ +
-public class Rectangle { +
-     +
-  // the Rectangle class has 3 fields +
-  public int width; +
-  public int height; +
-  public 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 ​) { +  int getX() { 
-    ​width = newWidth;+    ​return x;
   }   }
-    ​ +  ​ 
-  ​public ​void setHeight(int newHeight ​) { +  void setX(int xPos) { 
-    ​height ​newHeight;+    ​xPos;
   }   }
-    ​ +   
-  ​public ​void setOrigin(Point newOrigin) { +  int getY() { 
-    ​origin ​newOrigin+    return y; 
-  }     +  } 
-+  ​ 
 +  void setY(int yPos) { 
 +    ​yPos
 +  } 
 +}
 </​code>​ </​code>​
  
-Η κλάση ''​Rectangle'' ​επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''​origin''​. +Με χρήση της παραπάνω κλάσης η κλάση ''​Rectangle''​ γίνεται.
- +
-===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private ===== +
- +
-Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές **public** και **private**. Οι προσδιοριστές ​αυτοί αφορούν την ​προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. Στη συνέχεια θα δούμε και τον προσδιοριστή τύπου **protected** καθώς και την πιθανή έλλειψη προσδιοριστή τύπου, ο οποίος από μόνος του είναι ένας επιπλέον προσδιοριστής. Για την ώρα θα εξετάσουμε την διαφορά μεταξύ **public** και **private**. +
- +
-Όταν __ένα πεδίο ή μία μέθοδος__ ορίζεται ​ως **public** τότε αυτό είναι προσβάσιμο από οποιαδήποτε άλλη ​κλάση. Όταν ένα πεδίο ή μια μέθοδος ορίζεται ως **private** τότε αυτό είναι προσβάσιμο μόνο εντός της κλάσης στην οποία έχει οριστεί. /*: +
-  - άλλες κλάσεις που περιέχουν πεδία που ανήκουν στη συγκεκριμένη κλάση. Για παράδειγμα, ​η κλάση ''​Rectangle'' ​περιέχει το πεδίο ''​origin''​ που είναι του τύπου ''​Point''​. +
-  - [[java:​inheritance|υποκλάσεις]] που δημιουργούνται μέσω της διαδικασίας κληρονομικότητας και βασίζονται στην αρχική κλάση (//θα δούμε παρακάτω την έννοια της κληρονομικότητας//​) */ +
- +
-Με βάση τα παραπάνω η κλάση ''​Rectangle''​ δεν ​ έχει απευθείας πρόσβαση στα πεδία **x** και **y** του αντικειμένου **origin** που ανήκει στην κλάση **Point**, καθώς τα **x** και **y** έχουν οριστεί ως **private**. +
-<code java> +
-  private int x; +
-  private int y; +
-</​code>​ +
- +
-Σε αυτή την περίπτωση,​ ο μόνος τρόπος να προσπελαστούν τα δεδομένα της κλάσης **Point** είναι μέσω των μεθόδων  +
-  * 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>​ <code java Rectangle.java>​
- +class Rectangle {
-public ​class Rectangle {+
     ​     ​
   // the Rectangle class has 3 fields   // the Rectangle class has 3 fields
-  ​private ​int width; +  int width; 
-  ​private ​int height; +  int height; 
-  ​private ​Point origin;+  Point origin;
     ​     ​
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
Line 126: Line 65:
   }   }
  
-  ​public ​void setWidth(int newWidth ) {+  void setWidth(int newWidth ) {
     width = newWidth;     width = newWidth;
-  } 
-  ​ 
-  public int getWidth() { 
-    return width; 
   }   }
     ​     ​
-  ​public ​void setHeight(int newHeight ) {+  void setHeight(int newHeight ) {
     height = newHeight;     height = newHeight;
-  } 
-  ​ 
-  public int getHeight() { 
-    return height; 
   }   }
     ​     ​
-  ​public ​void setOrigin(Point newOrigin) {+  void setOrigin(Point newOrigin) {
     origin = newOrigin;     origin = newOrigin;
   }   }
   ​   ​
-  ​public ​Point getOrigin() {+  Point getOrigin() {
     return origin;     return origin;
   }   }
   ​   ​
 +  void setOrigin(int newX, int newY) {
 +    origin.setX(newX);​
 +    origin.setY(newY);​
 +  }
 } }
 </​code>​ </​code>​
  
-Για ​κάθε μεταβλητή έχουμε ορίσει συναρτήσεις λήψης ​της τιμής των ​πεδίων της ​κλάσης (**getters**), αλλά και συναρτήσεις ​για τον ​ορισμό ή την μεταβολή της ​τιμής τους (**setters**).+Η κλάση ''​Rectangle'' ​επομένως περιέχει εκτός από **primitive** ​πεδία και ένα ​**reference** πεδίοτο πεδίο ''​origin''​. 
 + 
 +<WRAP todo 80% center round> 
 +Μεταγλωττίστε τις δύο παραπάνω κλάσεις στο τερματικό σας, γράφοντας 
 +<​code>​ 
 +javac Point.java 
 +javac Rectangle.java 
 +</​code>​ 
 +</​WRAP>​
  
 |Προηγούμενο:​ [[:​java:​class| H κλάση ]] | [[:toc | Περιεχόμενα ]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]| |Προηγούμενο:​ [[:​java:​class| H κλάση ]] | [[:toc | Περιεχόμενα ]] | Επόμενο:​ [[:​java:​class_methods | Μέθοδοι της Κλάσης ]]|
java/class_fields.1455800242.txt.gz · Last modified: 2016/02/26 11:15 (external edit)