java:public_private_access_modifiers

Differences

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

Link to this comparison view

java:public_private_access_modifiers [2018/02/16 17:26] (current)
gthanos created
Line 1: Line 1:
 +====== Περιορισμός της πρόσβασης με τους προσδιοριστές public και private ======
  
 +Πιθανόν να παρατηρήσατε νωρίτερα τους προσδιοριστές **public** και **private**. Οι προσδιοριστές αυτοί αφορούν την προσβασιμότητα των πεδίων ή των μεθόδων της κλάσης από άλλες κλάσεις. [[java:​access_modifiers|Στη συνέχεια]] θα δούμε και τον προσδιοριστή τύπου **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** είναι μέσω των μεθόδων ​
 +<code java>
 +  public int getX();
 +  public int setX(int xPos);
 +  public int getY();
 +  public int setY(int yPos);
 +</​code>​
 +
 +Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα πεδία της κλάσης **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:​arrays| Πίνακες ]] |  [[:toc | Περιεχόμενα ]] | Επόμενο:​ [[:​java:​this_operator | O τελεστής this ]]|
java/public_private_access_modifiers.txt · Last modified: 2018/02/16 17:26 by gthanos