User Tools

Site Tools


java:static_keyword

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:static_keyword [2018/02/07 14:25] – [Στατικές μεταβλητές και μέθοδοι της κλάσης] gthanosjava:static_keyword [2022/02/23 18:57] (current) – [Χρήση σταθερών - Constants] gthanos
Line 1: Line 1:
 ====== Στατικές μεταβλητές και μέθοδοι της κλάσης ====== ====== Στατικές μεταβλητές και μέθοδοι της κλάσης ======
  
-Μέχρι τώρα είδαμε ότι τα πεδία και οι μέθοδοι ανήκουν στα επιμέρους αντικείμενα της κάθε κλάσης. Εκτός από την παραπάνω θεώρηση είναι δυνατόν να έχουμε πεδία και μεθόδους που δεν ανήκουν σε συγκεκριμένα αντικείμενα της κλάσης, αλλά στην κλάση. Σε αυτή τη σελίδα αναλύουμε την χρήση του keyword **static** για την δημιουργία στατικών πεδίων και μεθόδων που ανήκουν στην κλάση και όχι σε συγκεκριμένα αντικείμενα της κλάσης.+Μέχρι τώρα είδαμε ότι τα πεδία και οι μέθοδοι ανήκουν στα επιμέρους αντικείμενα της κάθε κλάσης. Εκτός από την παραπάνω θεώρηση είναι δυνατόν να έχουμε πεδία και μεθόδους που δεν ανήκουν σε αντικείμενα της κλάσης, αλλά στην ίδια την κλάση. Σε αυτή την ενότητα αναλύουμε την χρήση του keyword **static** για την δημιουργία στατικών πεδίων και στατικών μεθόδων που ανήκουν στην κλάση.
  
 <WRAP tip 80% center round> <WRAP tip 80% center round>
-Εάν τα πεδία ή οι μέθοδοι ανήκουν στη κλάση και όχι στα αντικείμενα της τότε οι μέθοδοι και τα πεδία είναι στατικά για τα αντικείμενα της κλάσης. Για παράδειγμα, αν προσπελάσουμε την τιμή ενός πεδίου που ανήκει στην κλάση από δύο διαφορετικά αντικείμενα της κλάσης τότε θα διαβάσουμε ακριβώς την ίδια τιμή.+Εάν τα πεδία ή οι μέθοδοι ανήκουν στη κλάση και όχι στα αντικείμενα της τότε οι μέθοδοι και τα πεδία είναι κοινά για τα αντικείμενα της κλάσης και ονομάζονται στατικά πεδία και στατικές μέθοδοι. Κατά συνέπεια, αν προσπελάσουμε την τιμή ενός στατικού πεδίου από δύο διαφορετικά αντικείμενα της κλάσης τότε θα διαβάσουμε ακριβώς την ίδια τιμή.
 </WRAP> </WRAP>
 +
 ===== Στατικές μεταβλητές της κλάσης ===== ===== Στατικές μεταβλητές της κλάσης =====
  
 Ας θεωρήσουμε το παρακάτω παράδειγμα από τον κώδικα του παραλληλόγραμμου. Ας θεωρήσουμε το παρακάτω παράδειγμα από τον κώδικα του παραλληλόγραμμου.
 <code java> <code java>
-public class Rectangle {+class Rectangle {
    
-  private int width; +  int width; 
-  private int height; +  int height; 
-  private Point origin;+  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   // the Rectangle class has one constructor
-  public Rectangle(int width, int height, Point origin) {+  Rectangle(int width, int height, Point origin) {
     this.width = width;     this.width = width;
     this.height = height;     this.height = height;
     this.origin = origin;     this.origin = origin;
 +    this.id = ++numberOfRectangles;
   }   }
-         
-  // add an instance variable for the object ID 
-  private int id; 
      
-  // add a class variable for the +  public int getID() { 
-  // number of Rectangle objects instantiated +    return id; 
-  private static int numberOfRectangles = 0;+  
 + 
 +  public static int getNumberOfRectangles() { 
 +    return numberOfRectangles; 
 +  } 
 + 
      
   /* οι υπόλοιπες εντολές της κλάσης είναι όμοιες    /* οι υπόλοιπες εντολές της κλάσης είναι όμοιες 
Line 37: Line 47:
 </code> </code>
  
-Με τον ορισμό <code java>private static int numberOfRectangles = 0;</code> δημιουργούμε μία μεταβλητή που έχει ενιαία τιμή για όλα τα αντικείμενα της κλάσης. Η μεταβλητή αυτή δεν ανήκει σε κάποιο από τα αντικείμενα, αλλά ΜΟΝΟ στην κλάση. Για τα αντικείμενα της κλάσης **Rectangle**, η συγκεκριμένη μεταβλητή μπορεί να θεωρηθεί στατική (για αυτό και η χρήση του //keyword static//).+Με τον ορισμό <code java>private static int numberOfRectangles = 0;</code> δημιουργούμε μία μεταβλητή που έχει ενιαία τιμή για όλα τα αντικείμενα της κλάσης. Η μεταβλητή αυτή δεν ανήκει σε κάποιο από τα αντικείμενα, αλλά ΜΟΝΟ στην κλάση. Για τα αντικείμενα της κλάσης **Rectangle**, η συγκεκριμένη μεταβλητή είναι κοινή.
  
 Για να προσπελάσουμε την τιμή της συγκεκριμένης μεταβλητής μπορούμε να το κάνουμε με τους εξής δύο τρόπους: Για να προσπελάσουμε την τιμή της συγκεκριμένης μεταβλητής μπορούμε να το κάνουμε με τους εξής δύο τρόπους:
Line 43: Line 53:
   - Με χρήση ενός αντικειμένου ως εξής ''Rectangle myRectangle = new Rectangle(); myRectangle.numberOfRectangles++;''.   - Με χρήση ενός αντικειμένου ως εξής ''Rectangle myRectangle = new Rectangle(); myRectangle.numberOfRectangles++;''.
  
-Και οι δύο παραπάνω τρόποι προσπέλασης είναι ισοδύναμοι για τον compiler. Ο 2ος τρόπος προσπέλασης **ΔΕΝ** συνιστάται, καθώς διαβάζοντας τον κώδικα δεν είναι σαφές αν πρόκειται για μεταβλητή που ανήκει στην κλάση ή στο αντικείμενο. Αντίθετα, ο 1ος τρόπος αφορά αποκλειστικά μεταβλητές που ανήκουν στην κλάση και για αυτό θεωρείται ορθότερος. Δείτε τον κώδικα της κλάσης **Rectangle** όπως διαμορφώνεται με την χρήση των δύο επιπλέον πεδίων και την καταγραφή του αριθμού των αντικειμένων που δημιουργούνται.+Και οι δύο παραπάνω τρόποι προσπέλασης είναι ισοδύναμοι για τον compiler. Όμως, ο 2ος τρόπος προσπέλασης **ΔΕΝ** συνιστάται, καθώς διαβάζοντας τη συγκεκριμένη γραμμή δεν είναι σαφές αν πρόκειται για μεταβλητή που ανήκει στην κλάση ή στο αντικείμενο. Αντίθετα, ο πρώτος τρόπος αφορά μεταβλητές που ανήκουν στην κλάση και για αυτό θεωρείται ορθότερος. Δείτε τον κώδικα της κλάσης **Rectangle** όπως διαμορφώνεται με την χρήση των δύο επιπλέον πεδίων και την καταγραφή του αριθμού των αντικειμένων που δημιουργούνται.
  
 <code java> <code java>
-public class Rectangle {+class Rectangle {
    
-  private int width; +  int width; 
-  private int height; +  int height; 
-  private Point origin;+  Point origin;
    
   // the Rectangle class has one constructor   // the Rectangle class has one constructor
-  public Rectangle(int width, int height, Point origin) {+  Rectangle(int width, int height, Point origin) {
     this.width = width;     this.width = width;
     this.height = height;     this.height = height;
Line 60: Line 70:
                  
   // add an instance variable for the object ID   // add an instance variable for the object ID
-  private int id;+  int id;
      
   // add a class variable for the   // add a class variable for the
   // number of Rectangle objects instantiated   // number of Rectangle objects instantiated
-  private static int numberOfRectangles = 0;+  static int numberOfRectangles = 0;
  
-  public int getID() {+  int getID() {
     return id;     return id;
   }   }
  
-  public static int getNumberOfRectangles() {+  static int getNumberOfRectangles() {
     return numberOfRectangles;     return numberOfRectangles;
   }   }
Line 86: Line 96:
 ===== Στατικές μέθοδοι της κλάσης ===== ===== Στατικές μέθοδοι της κλάσης =====
  
-Σε αναλογία με τις μεταβλητές της κλάσης μπορούμε να έχουμε και μεθόδους αποκλειστικά σε επίπεδο κλάσης. Οι μέθοδοι της κλάσης χρησιμοποιούνται για να προσπελάσουν στατικά πεδία της κλάσης. Επίσης, μέσα σε μία στατική μέθοδο μπορούν να δημιουργηθούν αντικείμενα οποιασδήποτε κλάσης. Σε αναλογία με τις μεταβλητές οι μέθοδοι σε επίπεδο κλάσης ορίζονται και πάλι με χρήση του keyword static, ως εξής.+Σε αναλογία με τις στατικές μεταβλητές της κλάσης μπορούμε να έχουμε και στατικές μεθόδους. Οι στατικές μέθοδοι χρησιμοποιούνται για να προσπελάσουν στατικά πεδία της κλάσης. Επίσης, μέσα σε μία στατική μέθοδο μπορούν να δημιουργηθούν αντικείμενα οποιασδήποτε κλάσης. Σε αναλογία με τις μεταβλητές οι μέθοδοι σε επίπεδο κλάσης ορίζονται και πάλι με χρήση του keyword static, ως εξής.
  
 <code java> <code java>
-public static int getNumberOfRectangles() {+static int getNumberOfRectangles() {
     return numberOfRectangles;     return numberOfRectangles;
 } }
Line 98: Line 108:
   - Με χρήση ενός αντικειμένου ως εξής ''Rectangle myRectangle = new Rectangle(); myRectangle.getNumberOfRectangles();''   - Με χρήση ενός αντικειμένου ως εξής ''Rectangle myRectangle = new Rectangle(); myRectangle.getNumberOfRectangles();''
  
-Οι στατικές μέθοδοι μπορούν να χρησιμοποιηθούν για να εκτελεστούν εργασίες που δεν συνδέονται με τα δεδομένα της κλάσης. Για παράδειγμα, η παρακάτω στατική μέθοδος υλοποιεί τον αλγόριθμο Bubble Sort μέσα σε μία κλάση με το όνομα Sort. Ο πίνακας προς ταξινόμηση και τα όρια ταξινόμησης του πίνακα λαμβάνονται ως ορίσματα στη μέθοδο. Η μέθοδος δεν έχει πρόσβαση σε πεδία της κλάσης και για αυτό μπορεί να δηλωθεί ως στατική.+Οι στατικές μέθοδοι μπορούν να χρησιμοποιηθούν για να εκτελεστούν εργασίες που δεν συνδέονται με τα πεδία και τις μεθόδους των αντικειμένων της κλάσης. Επιπλέον, οι στατικές μέθοδοι χρησιμοποιούνται και για την υλοποίηση αλγορίθμων οι οποίοι λαμβάνουν τα δεδομένα εισόδου ως παραμέτρους.  
 + 
 +Για παράδειγμα, η παρακάτω στατική μέθοδος υλοποιεί τον αλγόριθμο ταξινόμησης Bubble Sort μέσα σε μία κλάση με το όνομα Sort. Ο πίνακας προς ταξινόμηση και τα όρια ταξινόμησης του πίνακα λαμβάνονται ως ορίσματα. Η μέθοδος δε χρειάζεται να έχει πρόσβαση σε πεδία της κλάσης και για αυτό μπορεί να δηλωθεί ως στατική.
  
 <code java Sort.java> <code java Sort.java>
-public class Sort { +class Sort { 
-  public static void bubbleSort(String a[], int left, int right) {+  static void bubbleSort(String a[], int left, int right) {
     String temp;     String temp;
     for(int i=left; i<right; i++) {     for(int i=left; i<right; i++) {
Line 117: Line 129:
 </code> </code>
  
-Επίσης, μέσα σε μία στατική μέθοδο μπορούμε να δημιουργήσουμε αντικείμενα οποιασδήποτε κλάσης. Παράδειγμα στατικής μεθόδου είναι η μέθοδος **main()** από την οποία ξεκινάει κάθε πρόγραμμα. Δείτε την παρακάτω μέθοδο η οποία παράγει και επιστρέφει αντικείμενα της κλάσης **Rectangle** με τυχαίες τιμές.+Επιπλέον, μέσα σε μία στατική μέθοδο μπορούμε να δημιουργήσουμε αντικείμενα οποιασδήποτε κλάσης. Παράδειγμα στατικής μεθόδου είναι η μέθοδος **main()** από την οποία ξεκινάει κάθε πρόγραμμα. Δείτε την παρακάτω μέθοδο η οποία παράγει και επιστρέφει αντικείμενα της κλάσης **Rectangle** με τυχαίες τιμές (ως γεννήτρια τυχαίων αριθμών χρησιμοποείται η κλάση [[https://docs.oracle.com/javase/8/docs/api/java/util/Random.html|java.util.Random]]).
  
 <code java> <code java>
-/* η παράμετρος seed αρχικοποιεί την γεννήτρια τυχαίων  +/* η παράμετρος seed αρχικοποιεί την γεννήτρια τυχαίων αριθμών.
- αριθμών.+
  */  */
-public static Rectangle randomRectangle(int seed) {+static Rectangle randomRectangle(int seed) {
   java.util.Random rand = new java.util.Random(seed);   java.util.Random rand = new java.util.Random(seed);
   // εύρος τιμής randWidth (0 - 100)   // εύρος τιμής randWidth (0 - 100)
Line 137: Line 148:
  
 Συνολικά οι επιτρεπόμενοι συνδυασμοί μεταξύ στατικών και μη στατικών μεθόδων και μεταβλητών είναι οι εξής: Συνολικά οι επιτρεπόμενοι συνδυασμοί μεταξύ στατικών και μη στατικών μεθόδων και μεταβλητών είναι οι εξής:
-  * Μη στατικές μέθοδοι **ΜΠΟΡΟΥΝ** να προσπελάσουν μη στατικά πεδία+ 
-  Μη στατικές μέθοδοι **ΜΠΟΡΟΥΝ** να προσπελάσουν στατικά πεδία. +|                      ^  Στατικά πεδία  ^  Μη στατικά πεδία  ^ 
-  Στατικές μέθοδοι **ΜΠΟΡΟΥΝ** να προσπελάσουν στατικά πεδία. +Στατικές Μέθοδοι     |   ναι   όχι  |   
-  Στατικές μέθοδοι **ΔΕΝ ΜΠΟΡΟΥΝ **  να προσπελάσουν μη στατικά πεδία. +^ Μη Στατικές Μέθοδοι  |   ναι  |  ναι  |  
-    * το παραπάνω είναι λογικό αν αναλογιστείτε ότι μία στατική μέθοδος (που ανήκει συνολικά στην κλάση) δεν μπορεί να γνωρίζει το αντικείμενο στο οποίο ανήκει ένα μη στατικό πεδίο.+
  
 ===== Χρήση σταθερών - Constants ===== ===== Χρήση σταθερών - Constants =====
  
-H δημιουργία σταθερών επιτυγχάνεται με χρήση του συνδυασμού των keywords **static final**. Για παράδειγμα, εάν θέλουμε να γράψουμε την σταθερά π=3.141592653589793 θα μπορούσαμε να το κάνουμε ως εξής. +H δημιουργία σταθερών επιτυγχάνεται με χρήση του συνδυασμού των keywords **static final**. Για παράδειγμα, εάν θέλουμε να γράψουμε την σταθερά **π=3.141592653589793** θα μπορούσαμε να το κάνουμε ως εξής. 
-<code java> +<code java Circle.java> 
-static final double PI = 3.141592653589793;+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()); 
 +  } 
 +}
 </code> </code>
  
-Η σταθερά θα πρέπει να ανήκει σε μία κλάση σε αναλογία με τις στατικές μεταβλητές της κλάσης που ορίσαμε παραπάνω και δεν μπορεί να οριστεί αυτόνομα.+σταθερά PI πρέπει να αποτελεί στατικό πεδίο κάποιας κλάσης και δεν μπορεί να οριστεί αυτόνομα.
  
 |Προηγούμενο: [[:java:this_operator | Ο τελεστής this ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ java:member_initialization | Αρχικοποίηση των μελών της κλάσης ]]| |Προηγούμενο: [[:java:this_operator | Ο τελεστής this ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο: [[ java:member_initialization | Αρχικοποίηση των μελών της κλάσης ]]|
java/static_keyword.1518013553.txt.gz · Last modified: 2018/02/07 14:25 (external edit)