====== Περιορισμός της πρόσβασης με τους προσδιοριστές 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**. private int x; private int y; Σε αυτή την περίπτωση, ο μόνος τρόπος να προσπελαστούν τα δεδομένα της κλάσης **Point** από την κλάση **Rectangle** είναι μέσω των μεθόδων public int getX(); public int setX(int xPos); public int getY(); public int setY(int yPos); Ο παραπάνω περιορισμός δεν θα υπήρχε εάν τα πεδία της κλάσης **Point** είχαν οριστεί ως **public** αντί για **private**. Αλλάξτε τον προσδιοριστή πρόσβασης για τα πεδία της κλάσης **Point** από **private** σε **public**. Βγάλτε από τα σχόλια την μέθοδο που είναι στο τέλος της κλάσης και βάλτε σε σχόλια της αμέσως προηγούμενη μέθοδο. ===== Απόκρυψη δεδομένων και εσωτερικής υλοποίησης ===== Ένα από τα βασικά χαρακτηριστικά του Αντικειμενοστραφούς Προγραμματισμούς είναι η απόκρυψη των δεδομένων και της εσωτερικής υλοποίησης των κλάσεων στις υπόλοιπες κλάσεις που τις χρησιμοποιούν. Κατά κανόνα, συνηθίζουμε να παρέχουμε ένα σύνολο από μεθόδους, τις οποίες μπορούν να καλούν οι υπόλοιπες κλάσεις προκειμένου να χρησιμοποιήσουν την κλάση. Ο λόγος που συνήθως αποκρύπτουμε την εσωτερική υλοποίηση είναι ότι αν δεν γίνεται απευθείας χρήση των εσωτερικών δεδομένων μίας κλάσης ή των εσωτερικών μεθόδων αυτής, τότε η εσωτερική υλοποίηση της κλάσης μπορεί να αλλάξει, χωρίς η αλλαγή να επηρεάσει τις υπόλοιπες κλάσεις που χρησιμοποιούν τη συγκεκριμένη κλάση. Επιπρόσθετα, ο τρόπος χρήσης της κλάσης ελέγχεται από το δημιουργό της που ορίζει το σύνολο των public μεθόδων της. Η παραπάνω πρακτική συναντάται στην βιβλιογραφία ως **[[wp>Information_hiding|information hiding]]**. Ακολουθώντας την παραπάνω πρακτική επαναορίστε την κλάση **Rectangle**, ώστε να υπακούει στον παραπάνω κανόνα, δηλαδή αλλάξτε τους [[java:class_fields#Διάκριση μεταξύ πεδίων με τον προσδιοριστή πρόσβασης public και private|προσδιοριστές πρόσβασης]] των πεδίων της κλάσης **Rectangle** από ''public'' σε ''private'', ώστε να αποκλείσετε την πρόσβαση στα πεδία της κλάσης **Rectangle** από άλλες κλάσεις. Για κάθε πεδίο των κλάσεων **Point** και **Rectangle** έχουμε ορίσει συναρτήσεις λήψης της τιμής των πεδίων της κλάσης (γνωστές ως **getters** ή **accessors**), αλλά και συναρτήσεις για τον ορισμό ή την μεταβολή της τιμής τους (γνωστές ως **setters** ή **mutators**). |Προηγούμενο: [[:java:arrays| Πίνακες ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:this_operator | O τελεστής this ]]|