User Tools

Site Tools


java:static_keyword

Στατικές μεταβλητές και μέθοδοι της κλάσης

Μέχρι τώρα είδαμε ότι τα πεδία και οι μέθοδοι ανήκουν στα επιμέρους αντικείμενα της κάθε κλάσης. Εκτός από την παραπάνω θεώρηση είναι δυνατόν να έχουμε πεδία και μεθόδους που δεν ανήκουν σε αντικείμενα της κλάσης, αλλά στην ίδια την κλάση. Σε αυτή την ενότητα αναλύουμε την χρήση του keyword static για την δημιουργία στατικών πεδίων και στατικών μεθόδων που ανήκουν στην κλάση.

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

Στατικές μεταβλητές της κλάσης

Ας θεωρήσουμε το παρακάτω παράδειγμα από τον κώδικα του παραλληλόγραμμου.

class Rectangle {
 
  int width;
  int height;
  Point origin;
  // add an instance variable for the object ID
  int id;
 
    // add a class variable for the
  // number of Rectangle objects instantiated
  static int numberOfRectangles = 0;
 
  // the Rectangle class has one constructor
  Rectangle(int width, int height, Point origin) {
    this.width = width;
    this.height = height;
    this.origin = origin;
    this.id = ++numberOfRectangles;
  }
 
  public int getID() {
    return id;
  }
 
  public static int getNumberOfRectangles() {
    return numberOfRectangles;
  }
 
 
  /* οι υπόλοιπες εντολές της κλάσης είναι όμοιες 
   * με προηγούμενα παραδείγματα και παραλείπονται
   * για λόγους οικονομίας χώρου.
   */
}

Με τον ορισμό

private static int numberOfRectangles = 0;

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

Για να προσπελάσουμε την τιμή της συγκεκριμένης μεταβλητής μπορούμε να το κάνουμε με τους εξής δύο τρόπους:

  1. Με χρήση του ονόματος της κλάσης Rectangle.numberOfRectangles++;.
  2. Με χρήση ενός αντικειμένου ως εξής Rectangle myRectangle = new Rectangle(); myRectangle.numberOfRectangles++;.

Και οι δύο παραπάνω τρόποι προσπέλασης είναι ισοδύναμοι για τον compiler. Όμως, ο 2ος τρόπος προσπέλασης ΔΕΝ συνιστάται, καθώς διαβάζοντας τη συγκεκριμένη γραμμή δεν είναι σαφές αν πρόκειται για μεταβλητή που ανήκει στην κλάση ή στο αντικείμενο. Αντίθετα, ο πρώτος τρόπος αφορά μεταβλητές που ανήκουν στην κλάση και για αυτό θεωρείται ορθότερος. Δείτε τον κώδικα της κλάσης Rectangle όπως διαμορφώνεται με την χρήση των δύο επιπλέον πεδίων και την καταγραφή του αριθμού των αντικειμένων που δημιουργούνται.

class Rectangle {
 
  int width;
  int height;
  Point origin;
 
  // the Rectangle class has one constructor
  Rectangle(int width, int height, Point origin) {
    this.width = width;
    this.height = height;
    this.origin = origin;
  }
 
  // add an instance variable for the object ID
  int id;
 
  // add a class variable for the
  // number of Rectangle objects instantiated
  static int numberOfRectangles = 0;
 
  int getID() {
    return id;
  }
 
  static int getNumberOfRectangles() {
    return numberOfRectangles;
  }
 
  /* Ο κώδικας από εδώ και κάτω είναι ίδιος με προηγούμενες
   * εκδόσεις τις κλάσης και παραλείπεται για λόγους οικονομίας
   * χώρου.
   */
}

Μπορείτε να κατεβάσετε τον πλήρη κώδικα της κλάσης εδώ rectangle_example_with_static.zip.

Στατικές μέθοδοι της κλάσης

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

static int getNumberOfRectangles() {
    return numberOfRectangles;
}

Για να καλέσουμε στατικές μεθόδους σε αναλογία με τα πεδία έχουμε τις εξής επιλογές:

  1. Με χρήση του ονόματος της κλάσης Rectangle.getNumberOfRectangles();
  2. Με χρήση ενός αντικειμένου ως εξής Rectangle myRectangle = new Rectangle(); myRectangle.getNumberOfRectangles();

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

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

Sort.java
class Sort {
  static void bubbleSort(String a[], int left, int right) {
    String temp;
    for(int i=left; i<right; i++) {
      for(int j=right; j>i; j--) {
        if( a[j].compareTo(a[j-1])<0 ) {
          temp = a[j-1];
          a[j-1] = a[j];
          a[j] = temp;
        }
      }
    }
  }
}

Επιπλέον, μέσα σε μία στατική μέθοδο μπορούμε να δημιουργήσουμε αντικείμενα οποιασδήποτε κλάσης. Παράδειγμα στατικής μεθόδου είναι η μέθοδος main() από την οποία ξεκινάει κάθε πρόγραμμα. Δείτε την παρακάτω μέθοδο η οποία παράγει και επιστρέφει αντικείμενα της κλάσης Rectangle με τυχαίες τιμές (ως γεννήτρια τυχαίων αριθμών χρησιμοποείται η κλάση java.util.Random).

/* η παράμετρος seed αρχικοποιεί την γεννήτρια τυχαίων αριθμών.
 */
static Rectangle randomRectangle(int seed) {
  java.util.Random rand = new java.util.Random(seed);
  // εύρος τιμής randWidth (0 - 100)
  int randWidth = rand.nextInt(100);
  // εύρος τιμής randHeight (0 - 100)
  int randHeight = rand.nextInt(100);
  Rectangle rect = new Rectangle(randWidth,randHeight);
  return rect;
}

Συνδυασμοί πρόσβασης στατικών/μη στατικών πεδίων από στατικές/μη στατικές μεθόδους

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

Στατικά πεδία Μη στατικά πεδία
Στατικές Μέθοδοι ναι όχι
Μη Στατικές Μέθοδοι ναι ναι

Χρήση σταθερών - Constants

H δημιουργία σταθερών επιτυγχάνεται με χρήση του συνδυασμού των keywords static final. Για παράδειγμα, εάν θέλουμε να γράψουμε την σταθερά π=3.141592653589793 θα μπορούσαμε να το κάνουμε ως εξής.

Circle.java
class Circle {
  static final double PI = 3.141592653589793;
  int radius;
 
  Circle(int radius) {
    this.radius = radius;
  }
 
  int getRadius() { return radius; }
  void setRadius(int radius) { this.radius = radius; }
  double getArea() { return PI * radius * radius; }
  double getPerimeter() { return 2 * PI * radius; }
 
 
  static void main(String []args) {
    int radius = 3;
    Circle circle = new Circle(radius);
    System.out.println("Created circle with radius: "+radius);
    System.out.println("Perimeter of circle is: " + circle.getPerimeter());
    System.out.println("Area of circle is: " + circle.getArea());
  }
}

H σταθερά PI πρέπει να αποτελεί στατικό πεδίο κάποιας κλάσης και δεν μπορεί να οριστεί αυτόνομα.

java/static_keyword.txt · Last modified: 2022/02/23 18:57 by gthanos