User Tools

Site Tools


java:class_fields

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:class_fields [2017/02/09 15:08] – [Απόκρυψη δεδομένων και εσωτερικής υλοποίησης] gthanosjava:class_fields [2022/02/23 10:11] (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 12: Line 12:
 ===== Τύποι πεδίων της κλάσης ===== ===== Τύποι πεδίων της κλάσης =====
  
-Μία κλάση μπορεί να διαθέτει  +Μία κλάση μπορεί να διαθέτει τους εξής τύπους πεδίων 
-  - [[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 της προηγούμενης σελίδας]]Οι βασικοί τύποι δεδομένων περιγράφονται περιληπτικά στον παρακάτω πίνακα: 
 + 
 +^ τύπος δεδομένων ^ byte ^ short ^ int ^ long ^ float ^ double ^ boolean ^ char ^  
 +| αριθμός bits  |  8  |  16  |  32  |  64  |  32-bit IEEE 754 floating point  |  64-bit IEEE 754 floating point  |  not-applicable<color red>*</color>  |  16  |  
 +| αριθμός bytes |  1  |  2  |  4  |  8  |  4  |  8  |  not-applicable<color red>*</color>  |   
 +| εύρος τιμών    -128 έως 127  |  -32.768 έως 32.767  |  -2<sup>31</sup> έως 2<sup>31</sup>-1  |  -2<sup>63</sup> έως 2<sup>63</sup>  | |  |   μόνο δύο τιμές //true// και //false//  |  16bit Unicode characters 
 + 
 +<color red>*</color> Ο τύπος **boolean** λαμβάνει μόνο δύο τιμές. Ο αριθμός των bytes που καταλαμβάνονται δεν ορίζεται και πιθανόν διαφέρει από υλοποίηση σε υλοποίηση JVM. 
 + 
 +=== Αναφορικοί Τύποι === 
 + 
 +Αναφορικοί (reference) τύποι δεδομένων είναι οι μη βασικοί τύποι δεδομένων που περιγράφονται από κλάσεις. Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να προσθέσουμε τη θέση του ορθογώνιου παραλληλόγραμμου που ορίσαμε στην προηγούμενη παράγραφο στο δισδιάστατο χώρο. Η θέση του παραλληλογράμμου μπορεί να προσδιοριστεί από την παρακάτω κλάση **Point** η οποία περιγράφει ένα σημείο στο χώρο μέσω των συντεταγμένων του στους δύο άξονες. Θεωρούμε ότι το σημείο προσδιορίζει τη γωνία του παραλληλογράμμου με τις μικρότερες τιμές στον όριζόντιο και κάθετο άξονα (δηλ την κάτω αριστερή γωνία), όπως φαίνεται στο παρακάτω σχήμα.
  
 {{  :java:rectangle-origin.png?350  |  }} {{  :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>
  
-Με χρήση της παραπάνω κλάσης η κλάση ''Rectangle'' γίνεται.+Με χρήση της παραπάνω κλάσης η κλάση ''Rectangle'' μετασχηματίζεται ως εξής.
  
 <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 Point origin;+  Point origin;
          
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
Line 66: Line 78:
   }   }
  
-  public void setWidth(int newWidth ) {+  void setWidth(int newWidth ) {
     width = newWidth;     width = newWidth;
   }   }
          
-  public void setHeight(int newHeight ) {+  void setHeight(int newHeight ) {
     height = newHeight;     height = newHeight;
   }   }
          
-  public void setOrigin(Point newOrigin) {+  void setOrigin(Point newOrigin) {
     origin = newOrigin;     origin = newOrigin;
   }   }
      
-  public void setOrigin(int newX, int newY) { +  Point getOrigin() { 
-    origin = newOrigin;+    return origin;
   }   }
      
-  public void setOrigin(int newX, int newY) { +  int area() { 
-    origin.setX(newX); +    return width * height;
-    origin.setY(newY);+
   }   }
-  /*  +}
-  // this method cannot compile as long as x,y  +
-  // are declared private. +
-  public void setOrigin(int newX, int newY) { +
-    origin.x = newX; +
-    origin.y = newY; +
-  }  +
-  */    +
-+
 </code> </code>
  
 Η κλάση ''Rectangle'' επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''origin''. Η κλάση ''Rectangle'' επομένως περιέχει εκτός από **primitive** πεδία και ένα **reference** πεδίο, το πεδίο ''origin''.
- 
-<WRAP todo 80% center round> 
-Μεταγλωττίστε τις δύο παραπάνω κλάσεις γράφοντας 
-<code> 
-javac Point.java 
-javac Rectangle.java 
-</code> 
-</WRAP> 
- 
-===== Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης 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** από την κλάση **Rectangle** είναι μέσω των μεθόδων  
-  * public int getX() 
-  * public int setX(int xPos) 
-  * public int getY() 
-  * public int setY(int yPos) 
- 
-Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα πεδία της κλάσης **Point** είχαν οριστεί ως **public** αντί για **private**.  
- 
-<WRAP todo 80% center round> 
-Αλλάξτε τον προσδιοριστή πρόσβασης για τα πεδία της κλάσης **Point** από **private** σε **public**. Βγάλτε από τα σχόλια την μέθοδο που είναι στο τέλος της κλάσης και βάλτε σε σχόλια της αμέσως προηγούμενη μέθοδο. 
-</WRAP> 
- 
-===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== 
- 
-Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων στις υπόλοιπες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα, συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους, τις οποίες μπορούν να καλούν οι υπόλοιπες κλάσεις προκειμένου να χρησιμοποιήσουν την κλάση. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει, χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν την συγκεκριμένη κλάση. Επιπλέον, ο τρόπος χρήσης της κλάσης ελέγχεται από τον προγραμματιστή-δημιουργό της που ορίζει το σύνολο των public μεθόδων της. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>Information_hiding|information hiding]]**.   
- 
-<WRAP todo 80% center round> 
-Ακολουθώντας την παραπάνω πρακτική επαναορίστε την κλάση **Rectangle**, ώστε να υπακούει στον παραπάνω κανόνα, δηλαδή αλλάξτε τους [[java:class_fields#Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης **Rectangle** από ''public'' σε ''private'', ώστε να αποκλείσετε την πρόσβαση στα πεδία της κλάσης **Rectangle** από άλλες κλάσεις. 
-</WRAP> 
- 
-<WRAP tip 80% center round> 
-Για κάθε πεδίο των κλάσεων **Point** και **Rectangle** έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (γνωστές ως **getters** ή **accessors**), αλλά και συναρτήσεις για τον ορισμό ή την μεταβολή της τιμής τους (γνωστές ως **setters** ή **mutators**). 
-</WRAP> 
  
 |Προηγούμενο: [[:java:class| H κλάση ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:class_methods | Μέθοδοι της Κλάσης ]]| |Προηγούμενο: [[:java:class| H κλάση ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:class_methods | Μέθοδοι της Κλάσης ]]|
java/class_fields.1486652912.txt.gz · Last modified: 2017/02/09 15:08 by gthanos