Επεξήγηση τροποποιητών πρόσβασης σε Java

Τι είναι οι τροποποιητές πρόσβασης;

Θέλατε ποτέ να ορίσετε πώς οι χρήστες θα έχουν πρόσβαση σε ορισμένες από τις ιδιοκτησίες σας; Δεν θα θέλατε κανέναν να χρησιμοποιεί τα εσώρουχά σας. Ωστόσο, οι στενοί φίλοι και συγγενείς σας μπορούν να χρησιμοποιήσουν το πουλόβερ σας και ίσως το αυτοκίνητό σας.

Ομοίως με τον τρόπο που ορίζετε ένα επίπεδο πρόσβασης στις θέσεις σας, η Java ελέγχει επίσης την πρόσβαση. Θέλετε να ορίσετε το επίπεδο πρόσβασης για μεταβλητές, μεθόδους και τάξεις ανάλογα με το ποιες άλλες κατηγορίες θέλετε να έχετε πρόσβαση σε αυτές.

Η Java παρέχει 4 επίπεδα τροποποιητών πρόσβασης. Αυτό σημαίνει ότι μπορείτε να τροποποιήσετε την πρόσβαση σε μια μεταβλητή, μέθοδο ή τάξη με 4 τρόπους. Αυτοί οι 4 τρόποι είναι ιδιωτικοί, δημόσιοι, προστατευμένοι και προεπιλεγμένοι.

Αυτοί οι τροποποιητές πρόσβασης μπορούν να εφαρμοστούν σε πεδία, μεθόδους και τάξεις (Τα μαθήματα είναι μια ειδική περίπτωση, θα τα δούμε στο τέλος αυτού του άρθρου). Ακολουθεί μια γρήγορη επισκόπηση1 του τι Access Levelsείναι για κάθε ένα Access Modifier:

Αναφορά πίνακα τροποποιητών πρόσβασης:

Πίνακας τροποποιητών πρόσβασης

Τροποποιητής ιδιωτικής πρόσβασης

Επιτρέπει σε μια μεταβλητή ή μέθοδο να έχει πρόσβαση μόνο στην τάξη στην οποία δημιουργήθηκε. Κανένα άλλο μάθημα πέρα ​​από την κλάση που δημιούργησε τη μεταβλητή ή τη μέθοδο δεν μπορεί να έχει πρόσβαση σε αυτήν. Αυτό μοιάζει πολύ με τα εσωτερικά σας όργανα. Είναι προσβάσιμα μόνο από τον κάτοχο. Για να κάνετε μια μεταβλητή ή μια μέθοδο ιδιωτική, απλώς προσθέστε την ιδιωτική λέξη-κλειδί πριν από τη μεταβλητή ή τον τύπο μεθόδου. Ας χρησιμοποιήσουμε το ιδιωτικό σε ένα παράδειγμα κωδικοποίησης. Εάν μια τράπεζα θέλει να παρέχει επιτόκιο 10% στα δάνεια της, θα διασφαλίσει ότι η μεταβλητή επιτοκίου (ας υποθέσουμε int int_rate;) θα παραμείνει ιδιωτική, έτσι ώστε καμία άλλη τάξη δεν θα προσπαθούσε να έχει πρόσβαση και να την αλλάξει. Για παράδειγμα;

private String name;

Το παραπάνω παράδειγμα δημιουργεί μια μεταβλητή που ονομάζεται όνομα και διασφαλίζει ότι είναι προσβάσιμη μόνο εντός της κλάσης από την οποία δημιουργήθηκε.

Ένα άλλο παράδειγμα για μια μέθοδο είναι

private void setAge(){ System.out.println("Set Age"); }

Το παραπάνω παράδειγμα διασφαλίζει ότι η μέθοδος setAge είναι προσβάσιμη μόνο εντός της κλάσης από την οποία δημιουργήθηκε και πουθενά αλλού.

Τροποποιητής δημόσιας πρόσβασης

Ο τροποποιητής δημόσιας πρόσβασης είναι το άμεσο αντίθετο του τροποποιητή ιδιωτικής πρόσβασης Μια τάξη, μέθοδος ή μεταβλητή μπορεί να δηλωθεί ως δημόσια και σημαίνει ότι είναι προσβάσιμη από οποιαδήποτε κατηγορία. Ο τροποποιητής δημόσιας πρόσβασης μπορεί να παρομοιαστεί με ένα δημόσιο σχολείο όπου ο καθένας μπορεί να ζητήσει την είσοδο και να γίνει δεκτός.

Μια δημόσια τάξη, μέθοδος ή μεταβλητή μπορεί να προσεγγιστεί από οποιαδήποτε άλλη τάξη ανά πάσα στιγμή.

Για παράδειγμα, για να δηλώσετε μια τάξη ως δημόσια, το μόνο που χρειάζεστε είναι:

public class Animal{ }

Ως τέτοια, η κατηγορία Animal μπορεί να προσεγγιστεί από οποιαδήποτε άλλη τάξη.

public int age; public int getAge(){ }

Παρακάτω είναι τρόποι καθορισμού μιας μεταβλητής και μιας μεθόδου ως δημόσια.

Ο προεπιλεγμένος τροποποιητής πρόσβασης

Ο προεπιλεγμένος τροποποιητής πρόσβασης είναι διαφορετικός από όλους τους άλλους τροποποιητές πρόσβασης καθώς δεν έχει λέξη-κλειδί. Για να χρησιμοποιήσετε τον προεπιλεγμένο τροποποιητή πρόσβασης, απλά δεν χρησιμοποιείτε κανέναν από τους άλλους τροποποιητές πρόσβασης και αυτό σημαίνει απλώς ότι χρησιμοποιείτε έναν προεπιλεγμένο τροποποιητή πρόσβασης.

Για παράδειγμα, για να χρησιμοποιήσετε τον προεπιλεγμένο τροποποιητή πρόσβασης για μια τάξη, χρησιμοποιείτε

class Bird{ }

Αυτό ουσιαστικά σημαίνει ότι χρησιμοποιείτε τον προεπιλεγμένο τροποποιητή πρόσβασης. Ο προεπιλεγμένος τροποποιητής πρόσβασης επιτρέπει σε μια μεταβλητή, μέθοδο ή κλάση να είναι προσβάσιμη από άλλες κατηγορίες εντός του ίδιου πακέτου. Ένα πακέτο είναι μια συλλογή σχετικών τάξεων σε έναν κατάλογο αρχείων. Για περισσότερες πληροφορίες σχετικά με τα πακέτα, ανατρέξτε στην ενότητα σχετικά με τα πακέτα.

Δεν είναι δυνατή η πρόσβαση σε οποιαδήποτε μεταβλητή, μέθοδο ή κλάση που δηλώνεται ότι χρησιμοποιεί τον προεπιλεγμένο τροποποιητή πρόσβασης από οποιαδήποτε άλλη κλάση εκτός του πακέτου από το οποίο δηλώθηκε.

int age; void setNewAge(){ }

Παρακάτω είναι μερικοί τρόποι χρήσης του προεπιλεγμένου τροποποιητή πρόσβασης για μια μεταβλητή ή μέθοδο. Μην ξεχνάτε ότι ο προεπιλεγμένος τροποποιητής πρόσβασης δεν έχει λέξη κλειδί. Η απουσία των 3 άλλων τροποποιητών πρόσβασης σημαίνει ότι χρησιμοποιείτε τον προεπιλεγμένο τροποποιητή πρόσβασης.

Προστατευμένος τροποποιητής πρόσβασης

Ο προστατευμένος τροποποιητής πρόσβασης σχετίζεται στενά με τον προεπιλεγμένο τροποποιητή πρόσβασης. Ο προστατευμένος τροποποιητής πρόσβασης έχει τις ιδιότητες του προεπιλεγμένου τροποποιητή πρόσβασης αλλά με λίγη βελτίωση.

Μια μεταβλητή και μια μέθοδος είναι οι μόνες που χρησιμοποιούν τον τροποποιητή πρόσβασης με προστασία. Η μικρή βελτίωση είναι ότι μια κλάση εκτός του πακέτου κλάσης από την οποία δηλώθηκε η μεταβλητή ή μέθοδος μπορεί να έχει πρόσβαση στην εν λόγω μεταβλητή ή μέθοδο. Αυτό είναι δυνατό ΜΟΝΟ αν κληρονομεί από την τάξη, ωστόσο.

Η κλάση από άλλο πακέτο που μπορεί να δει προστατευμένες μεταβλητές ή μεθόδους πρέπει να έχει επεκτείνει την κλάση που δημιούργησε τις μεταβλητές ή μεθόδους.

Σημειώστε χωρίς το πλεονέκτημα του Inheritance, ένας προεπιλεγμένος τροποποιητής πρόσβασης έχει ακριβώς την ίδια πρόσβαση με έναν προστατευμένο τροποποιητή πρόσβασης.

Παραδείγματα χρήσης του προστατευμένου τροποποιητή πρόσβασης παρουσιάζονται παρακάτω:

protected int age; protected String getName(){ return "My Name is You"; }

Πρόσβαση τροποποιητών στις τάξεις

Από προεπιλογή, οι τάξεις μπορούν να έχουν μόνο 2 τροποποιητές:

  • δημόσιο
  • χωρίς τροποποιητή (προεπιλεγμένος τροποποιητής)

Αυτό σημαίνει ότι τα μαθήματα δεν μπορούν ποτέ να ρυθμιστούν privateή protected;

Αυτό είναι λογικό, γιατί θα θέλατε να κάνετε μια ιδιωτική τάξη; Κανένα άλλο μάθημα δεν θα μπορούσε να το χρησιμοποιήσει. Αλλά μερικές φορές, μπορείτε να ενσωματώσετε μια τάξη σε μια άλλη τάξη. Αυτές οι ειδικές τάξεις, inner classesμπορούν να οριστούν σε ιδιωτικές ή προστατευμένες έτσι ώστε μόνο η γύρω τάξη να μπορεί να έχει πρόσβαση:

public class Car { private String brand; private Engine engine; // ... private class Engine { // ... } }

Στο παραπάνω παράδειγμα, μόνο η Carτάξη μπορεί να χρησιμοποιήσει την Engineτάξη. Αυτό μπορεί να είναι χρήσιμο σε ορισμένες περιπτώσεις.

Άλλα μαθήματα δεν μπορούν ποτέ να ρυθμιστούν protectedή private, επειδή δεν έχει νόημα. Ο protectedτροποποιητής πρόσβασης χρησιμοποιείται για να κάνει πράγματα package-privateαλλά με την επιλογή να είναι προσβάσιμος σε υποκατηγορίες. Στην Ιάβα δεν υπάρχει έννοια όπως «υπο-συσκευασίες» ή «πακέτο-κληρονομιά».