Μεταβλητές και μέθοδοι στην Java μπορούν να έχουν διάφορους modifiers, δηλαδή επιπρόσθετες λέξεις-κλειδιά που τροποποιούν τη συμπεριφορά τους. Οι συνηθέστεροι modifiers στην Java είναι οι εξής:

  • public: Η μεταβλητή ή η μέθοδος είναι προσβάσιμη από οπουδήποτε.
  • private: Η μεταβλητή ή η μέθοδος είναι προσβάσιμη μόνο από μέσα στην ίδια κλάση.
  • protected: Η μεταβλητή ή η μέθοδος είναι προσβάσιμη από την ίδια κλάση, κληρονομικές κλάσεις και κλάσεις στο ίδιο πακέτο.
  • default: Η μεταβλητή ή η μέθοδος είναι προσβάσιμη μόνο από κλάσεις στο ίδιο πακέτο.

Παρακάτω είναι ένα παράδειγμα χρήσης των modifiers σε μια κλάση:

public class MyClass {
  public int x;          // public modifier
  private int y;         // private modifier
  protected int z;      // protected modifier
  int w;                 // default modifier
}

Στο παραπάνω παράδειγμα, η μεταβλητή x έχει τον public modifier, η μεταβλητή y έχει τον private modifier, η μεταβλητή z έχει τον protected modifier και η μεταβλητή w έχει τον default modifier.

Η λέξη-κλειδί public είναι ένας access modifier, δηλαδή χρησιμοποιείται για να ορίσει το επίπεδο πρόσβασης σε κλάσεις, χαρακτηριστικά, μέθοδους και constructors.

Οι modifiers χωρίζονται σε δύο ομάδες:

Access Modifiers – ελέγχουν το επίπεδο πρόσβασης
Non-Access Modifiers – δεν ελέγχουν το επίπεδο πρόσβασης, αλλά παρέχουν άλλες λειτουργίες

Εδώ είναι μερικά από τα πιο συνηθισμένα modifiers στην Java:

Access Modifiers:

  • public: Η κλάση ή οι μέθοδοι είναι προσβάσιμες από οπουδήποτε.
  • private: Η κλάση ή οι μέθοδοι είναι προσβάσιμες μόνο από την ίδια κλάση.
  • protected: Η κλάση ή οι μέθοδοι είναι προσβάσιμες από την ίδια κλάση, κληρονομικές κλάσεις και κλάσεις στο ίδιο πακέτο.
  • default: Η κλάση ή οι μέθοδοι είναι προσβάσιμες μόνο από κλάσεις στο ίδιο πακέτο.

Non-Access Modifiers:

  • static: Η μεταβλητή ή η μέθοδος ανήκει στην κλάση, αντί για κάθε αντικείμενο της κλάσης.
  • final: Η μεταβλητή δεν μπορεί να τροποποιηθεί μετά την αρχικοποίησή της. Μια μέθοδος final δεν μπορεί να υποκατασταθεί από μια κληρονομική κλάση.
  • abstract: Η μέθοδος δεν έχει σώμα και πρέπει να υλοποιηθεί από μια κλάση-υποκλάση.
  • synchronized: Μόνο ένα νήμα μπορεί να εκτελεί αυτήν τη μέθοδο σε οποιοδήποτε σημείο χρόνου.
  • volatile: Η τιμή της μεταβλητής δεν πρέπει να προβληθεί από κρυφά νήματα ή να αποθηκευτεί σε κρυφή κρυφή μνήμη.
  • transient: Η μεταβλητή δεν αποθηκεύεται από τον μηχανισμό αποθήκευσης κατάστασης αντικειμένων.
  • strictfp: Οι πράξεις με αριθμούς κινητής υποδιαστολής ακολουθούν τις αυστηρές προδιαγραφές του προτύπου IEEE 754.
  • Μπορείτε να συνδυάσετε modifiers όπως θέλετε. Για παράδειγμα, μια μέθοδος μπορεί να είναι και public και static.

Για τις κλάσεις στη Java, μπορείτε να χρησιμοποιήσετε είτε το public είτε το default modifier:

Modifier Περιγραφή
public Η κλάση είναι προσβάσιμη από οποιαδήποτε άλλη κλάση.
default Η κλάση είναι προσβάσιμη μόνο από κλάσεις στο ίδιο πακέτο. Αυτό χρησιμοποιείται όταν δεν καθορίζετε κάποιο modifier.

[adinserter block=”2″]

Για τα χαρακτηριστικά και τις μεθόδους στη Java, μπορείτε να χρησιμοποιήσετε τους παρακάτω modifiers:

Modifier Περιγραφή
public Το χαρακτηριστικό ή η μέθοδος είναι προσβάσιμη από οποιαδήποτε άλλη κλάση.
private Το χαρακτηριστικό ή η μέθοδος είναι προσβάσιμη μόνο από την ίδια κλάση.
protected Το χαρακτηριστικό ή η μέθοδος είναι προσβάσιμη από την ίδια κλάση, κληρονομικές κλάσεις και κλάσεις στο ίδιο πακέτο.
default Το χαρακτηριστικό ή η μέθοδος είναι προσβάσιμη μόνο από κλάσεις στο ίδιο πακέτο.

Για τις κλάσεις στη Java, μπορείτε να χρησιμοποιήσετε τους εξής non-access modifiers:

Modifier Περιγραφή
final Η κλάση δεν μπορεί να κληρονομηθεί από άλλες κλάσεις (θα μάθετε περισσότερα σχετικά με την κληρονομιά στο κεφάλαιο Κληρονομιά).
abstract Η κλάση δεν μπορεί να χρησιμοποιηθεί για να δημιουργήσει αντικείμενα (για να έχετε πρόσβαση σε μια abstract κλάση, πρέπει να κληρονομήσετε από μια άλλη κλάση. Θα μάθετε περισσότερα για την κληρονομιά και την αφαίρεση στα κεφάλαια Κληρονομιά και Αφαίρεση).

Για τα χαρακτηριστικά και τις μεθόδους στη Java, μπορείτε να χρησιμοποιήσετε τους παρακάτω non-access modifiers:

Modifier Περιγραφή
static Η μεταβλητή ή η μέθοδος ανήκει στην κλάση αντί για κάθε αντικείμενο της κλάσης.
final Η μεταβλητή δεν μπορεί να τροποποιηθεί μετά την αρχικοποίηση της. Μια μέθοδος final δεν μπορεί να υποκατασταθεί από μια κληρονομική κλάση.
abstract Η μέθοδος δεν έχει σώμα και πρέπει να υλοποιηθεί από μια κλάση-υποκλάση.
synchronized: Μόνο ένα νήμα μπορεί να εκτελεί τη μέθοδο σε μια στιγμή.
volatile: Η τιμή της μεταβλητής δεν μπορεί να αποθηκευτεί στην κρυφή μνήμη του συστήματος. Αυτό σημαίνει ότι η τιμή της μεταβλητής θα πρέπει να διαβάζεται από τη βασική μνήμη σε κάθε νήμα.
transient: Η μεταβλητή δεν αποθηκεύεται κατά τη σειριοποίηση ενός αντικειμένου.
native: Η μέθοδος υλοποιείται σε κώδικα μηχανής και δεν είναι υλοποιημένη σε Java.

Αν δεν θέλετε να επιτρέπεται η αλλαγή τιμών υπαρχόντων χαρακτηριστικών, δηλώστε τα χαρακτηριστικά ως final:

Example:

public class MyClass {
  final int x = 10;
  final double PI = 3.14;

  public static void main(String[] args) {
    MyClass myObj = new MyClass();
    myObj.x = 50; // will generate an error: cannot assign a value to a final variable
    myObj.PI = 25; // will generate an error: cannot assign a value to a final variable
    System.out.println(myObj.x);
    System.out.println(myObj.PI);
  }
}

Στο παραπάνω παράδειγμα, το x είναι μια μεταβλητή final που αρχικοποιείται στην τιμή 10 και δεν μπορεί να αλλάξει τιμή αργότερα. Επίσης, το PI είναι μια σταθερά τιμή (final variable) που δεν μπορεί να αλλάξει τιμή αργότερα. Όταν προσπαθείτε να αλλάξετε τις τιμές των μεταβλητών αυτές, θα προκαλέσετε σφάλμα καθώς έχουν οριστεί ως final.

[adinserter block=”3″]

Μια στατική μέθοδος σημαίνει ότι μπορεί να προσπελαστεί χωρίς τη δημιουργία αντικειμένου της κλάσης, σε αντίθεση με τη δηλώση public:

Παράδειγμα:

public class MyClass {
  static void myStaticMethod() {
    System.out.println("Static methods can be called without creating objects");
  }

  public void myPublicMethod() {
    System.out.println("Public methods must be called by creating objects");
  }

  public static void main(String[ ] args) {
    myStaticMethod(); // Call the static method
    // myPublicMethod(); Σφάλμα κατά την μεταγλώττιση
    MyClass myObj = new MyClass(); // Create an object of MyClass
    myObj.myPublicMethod(); // Call the public method
  }
}

Στο παραπάνω παράδειγμα, η μέθοδος myStaticMethod() είναι στατική και μπορεί να καλεστεί απευθείας χωρίς τη δημιουργία αντικειμένου της κλάσης. Η myPublicMethod() είναι μια δημόσια μέθοδος και πρέπει να καλείται μέσω αντικειμένων της κλάσης.

Μια αφαιρετική μέθοδος ανήκει σε μια αφαιρετική κλάση και δεν έχει σώμα. Το σώμα παρέχεται από την υποκλάση:

Παράδειγμα:

abstract class Animal {
  public abstract void animalSound();
  public void sleep() {
    System.out.println("Zzz");
  }
}

class Cat extends Animal {
  public void animalSound() {
    System.out.println("The cat says: Meow");
  }
}

public class Main {
  public static void main(String[] args) {
    Cat myCat = new Cat(); // Create a Cat object
    myCat.animalSound(); // Call the abstract method
    myCat.sleep(); // Call the regular method
  }
}

Στο παραπάνω παράδειγμα, η μέθοδος animalSound() είναι αφαιρετική, δηλώνεται στην αφαιρετική κλάση Animal αλλά δεν έχει υλοποίηση σε αυτή την κλάση. Η υλοποίηση γίνεται στην υποκλάση Cat. Η μέθοδος sleep() δεν είναι αφαιρετική και δηλώνεται και υλοποιείται στην κλάση Animal. Η μέθοδος main() δημιουργεί ένα αντικείμενο της κλάσης Cat και καλεί την αφαιρετική μέθοδο animalSound() και την κανονική μέθοδο sleep().

15 Μαΐου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων