java:static_keyword

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Στατικές μεταβλητές και μέθοδοι της κλάσης ====== Μέχρι τώρα είδαμε ότι τα αντικείμενα αποτελούν υλοποιήσεις της κλάσης που είναι το "σχέδιο" των αντικειμένων που υλοποιούνται. Με την έννοια αυτή όλα τα πεδία και οι μέθοδοι της κλάσης ανήκουν τελικά στα επιμέρους αντικείμενα της κάθε κλάσης. Εκτός από την παραπάνω θεώρηση είναι δυνατόν να έχουμε πεδία και μεθόδους που δεν ανήκουν σε συγκεκριμένα αντικείμενα, αλλά στην κλάση συνολικά. Με την έννοια αυτή οι συγκεκριμένος τύπος πεδίων ή μεθόδων είναι στατικές για τα αντικείμενα της κλάσης. Για παράδειγμα, αν προσπελάσουμε την τιμή ενός πεδίου που ανήκει στην κλάση από δύο διαφορετικά αντικείμενα της ίδιας κλάσης τότε θα διαβάσουμε ακριβώς την ίδια τιμή. Σε αυτή τη σελίδα αναλύουμε την χρήση του keyword **static** για την δημιουργία στατικών πεδίων και μεθόδων που ανήκουν στην κλάση και όχι σε συγκεκριμένα αντικείμενα της κλάσης. ===== Στατικές μεταβλητές της κλάσης ===== Ας θεωρήσουμε το παρακάτω παράδειγμα από τον κώδικα του ποδηλάτου. <code java> public class Bicycle { private int cadence; private int gear; private int speed; // add an instance variable for the object ID private int id; // add a class variable for the // number of Bicycle objects instantiated private static int numberOfBicycles = 0; ... } </code> Προσθέτοντας την μεταβλητή <code java>private static int numberOfBicycles = 0;</code> δημιουργούμε μία μεταβλητή που έχει ενιαία τιμή για όλες τα αντικείμενα της κλάσης μας. Η μεταβλητή αυτή δεν ανήκει σε κάποιο από τα αντικείμενα, αλλά ανήκει στην κλάση. Επομένως, για τα αντικείμενα της κλάσης αυτής, η συγκεκριμένη μεταβλητή μπορεί να θεωρηθεί στατική (για αυτό και η χρήση του keyword static). Για να προσπελάσουμε την τιμή της συγκεκριμένης μεταβλητής μπορούμε να το κάνουμε με δύο τρόπους - Με χρήση του ονόματος της κλάσης ''Bicycle.numberOfBicycles++;''. - Με χρήση ενός αντικειμένου ως εξής ''Bicycle myBike = new Bicycle(); myBike.numberOfBicycles++;''. Και οι δύο παραπάνω τρόποι προσπέλασης είναι ισοδύναμοι. Ο 2ος τρόπος προσπέλασης ΔΕΝ συνιστάται, καθώς δεν είναι σαφές αν πρόκειται για μεταβλητή που ανήκει στην κλάση ή κανονική μεταβλητή. Αντίθετα, ο 1ος τρόπος αφορά αποκλειστικά μεταβλητές που ανήκουν στην κλάση και για αυτό θεωρείται προγραμματιστικά ορθότερος. Δείτε τον κώδικα της κλάσης ''Bicycle'' όπως διαμορφώνεται με την χρήση των δύο επιπλέον πεδίων και την καταγραφή του αριθμού των αντικειμένων που δημιουργούνται. <code java> public class Bicycle { private int cadence; private int gear; private int speed; private int id; private static int numberOfBicycles = 0; public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; id = ++numberOfBicycles; } public int getID() { return id; } public static int getNumberOfBicycles() { return numberOfBicycles; } /* Ο κώδικας από εδώ και κάτω είναι ίδιος με προηγούμενες * εκδόσεις τις κλάσης και παραλείπεται για λόγους οικονομίας * χώρου. */ } </code> Μπορείτε να κατεβάσετε τον πλήρη κώδικα της κλάσης εδώ {{:java:bicycle-with-static-field.zip|}}. ===== Μέθοδοι της κλάσης ===== Σε αναλογία με τις μεταβλητές της κλάσης μπορούμε να έχουμε και μεθόδους αποκλειστικά σε επίπεδο κλάσης. Συνήθως οι μέθοδοι της κλάσης χρησιμοποιούνται για να προσπελάσουν στατικά πεδία της κλάσης. Σε αναλογία με τις μεταβλητές οι μέθοδοι σε επίπεδο κλάσης ορίζονται και πάλι με χρήση του keyword static, ως εξής. <code java> public static int getNumberOfBicycles() { return numberOfBicycles; } </code> Για να καλέσουμε στατικές μεθόδους σε αναλογία με τα πεδία έχουμε τις εξής επιλογές - Με χρήση του ονόματος της κλάσης ''Bicycle.getNumberOfBicycles();''.. - Με χρήση ενός αντικειμένου ως εξής ''Bicycle myBike = new Bicycle(); myBike.getNumberOfBicycles();''. ===== Συνδυασμοί πρόσβασης στατικών/μη στατικών πεδίων από στατικές/μη στατικές μεθόδους ===== Συνολικά οι επιτρεπόμενοι συνδυασμοί μεταξύ στατικών και μη στατικών μεθόδων και μεταβλητών είναι οι εξής: * Μη στατικές μέθοδοι **ΜΠΟΡΟΥΝ** να προσπελάσουν μη στατικά πεδία. * Μη στατικές μέθοδοι **ΜΠΟΡΟΥΝ** να προσπελάσουν στατικά πεδία. * Στατικές μέθοδοι **ΜΠΟΡΟΥΝ** να προσπελάσουν στατικά πεδία. * Στατικές μέθοδοι **ΔΕΝ ΜΠΟΡΟΥΝ ** να προσπελάσουν μη στατικά πεδία. * το παραπάνω είναι λογικό αν αναλογιστείτε ότι μία στατική μέθοδος (που ανήκει συνολικά στην κλάση) δεν μπορέι να γνωρίζει το αντικείμενο στο οποίο ανήκει ένα μη στατικό πεδίο. ===== Χρήση σταθερών - Constants ===== H δημιουργία σταθερών επιτυγχάνεται με χρήση του συνδυασμού των keywords **static final**. Για παράδειγμα, εάν θέλουμε να γράψουμε την σταθερά π=3.141592653589793 θα μπορούσαμε να το κάνουμε ως εξής. <code java> static final double PI = 3.141592653589793; </code> Η σταθερά θα πρέπει να ανήκει σε μία κλάση σε αναλογία με τις στατικές μεταβλητές της κλάσης που ορίσαμε παραπάνω και δεν μπορεί να οριστεί αυτόνομα. |Προηγούμενο: [[:java:this_operator | Ο τελεστής this ]] | Επόμενο: [[ java:member_initialization | Αρχικοποίηση των μελών της κλάσης ]]|

java/static_keyword.1424069011.txt.gz · Last modified: 2016/02/26 11:15 (external edit)