Οδηγοί

Διόρθωση: Δεν είναι δυνατή η αναφορά μη στατικής μεθόδου από ένα στατικό περιβάλλον

Πολλοί προγραμματιστές αντιμετωπίζουν το μήνυμα σφάλματος «Η μη στατική μέθοδος δεν μπορεί να αναφέρεται από ένα στατικό περιβάλλον«Όταν κωδικοποιούν. Αυτό το μήνυμα σφάλματος δεν είναι συγκεκριμένο και μπορεί να προκύψει σε οποιοδήποτε IDE εάν ισχύουν οι συνθήκες για το σφάλμα.

Αυτό είναι ένα πολύ κοινό λάθος για αρχάριους όπου ο προγραμματιστής προσπαθεί να χρησιμοποιήσει μια τάξη «στατικά» χωρίς να κάνει μια παρουσία της τάξης. Υπάρχουν αρκετές προϋποθέσεις που πρέπει να πληρούνται όταν χρησιμοποιείτε μια τάξη που είναι στατική. Σε αυτό το άρθρο, θα εξετάσουμε πολλές διαφορετικές περιπτώσεις και θα σας καθοδηγήσουμε σχετικά με τον τρόπο χρήσης μιας στατικής τάξης.

Τι είναι μια στατική μέθοδος;

Η προσθήκη της λέξης-κλειδιού «στατική» σε οποιαδήποτε μέθοδο καθιστά τη μέθοδο γνωστή ως στατική μέθοδο. Μια στατική μέθοδος ανήκει στην τάξη και όχι σε ένα αντικείμενο (που είναι ο κανόνας). Μια στατική μέθοδος μπορεί εύκολα να χρησιμοποιηθεί χωρίς την προϋπόθεση να δημιουργηθεί μια παρουσία μιας τάξης.

Υπάρχουν πολλές διαφορετικές χρήσεις των στατικών μεθόδων, για παράδειγμα, χρησιμοποιώντας τη, μπορείτε να αλλάξετε ένα μέλος στατικών δεδομένων και την αξία του. Ωστόσο, εξακολουθούν να υπάρχουν ορισμένοι περιορισμοί κατά τη χρήση μιας Στατικής μεθόδου. Για παράδειγμα, εάν θέλετε να αποκτήσετε πρόσβαση σε μη στατικά πεδία της τάξης σας, πρέπει να χρησιμοποιήσετε μια μη στατική μέθοδο. Συνοψίζοντας, οι στατικές μέθοδοι χρησιμοποιούνται πολύ σπάνια, αλλά έχουν τα οφέλη τους.

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

μαθητές τάξης {int roll_no; Όνομα συμβολοσειράς; static String College = "InformationTech"; στατική αλλαγή κενού () {κολλέγιο = "Διαχείριση";} Φοιτητές (αριθμός int, όνομα συμβολοσειράς) {roll_no = number; name = name_self;} εμφάνιση κενού () {System.out.println (rollno + "" + name + "" + κολέγιο);} δημόσιος στατικός κενός κενός (String args []) {Students.change (); Students stu_1 = new Students (100, "Mexican"); Students stu_2 = new Students (202, "American"); Students stu_3 = νέοι μαθητές (309, "Βρετανικά"); stu_1.display (); stu_2.display (); stu_3.display ();}}

Το αποτέλεσμα του προγράμματος θα είναι:

100 Μεξικάνικη διοίκηση 202 Αμερικανική διαχείριση 309 Βρετανική διαχείριση

Ποια είναι η διαφορά μεταξύ μιας τάξης και της παρουσίας μιας τάξης;

Σκεφτείτε ότι περπατάτε στο δρόμο και βλέπετε ένα αυτοκίνητο. Τώρα ξέρετε αμέσως ότι πρόκειται για αυτοκίνητο ακόμα κι αν δεν ξέρετε ποιο είναι το μοντέλο ή ο τύπος του. Αυτό συμβαίνει επειδή γνωρίζετε ότι ανήκει στην κατηγορία των «αυτοκινήτων» για τα οποία γνωρίζετε ήδη. Σκεφτείτε την τάξη εδώ ως πρότυπο ή ιδέα.

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

Ένα παράδειγμα ιδιοτήτων μπορεί να είναι ότι η κατηγορία «αυτοκίνητο» δηλώνει ότι όλα τα αυτοκίνητα πρέπει να έχουν τροχούς. Το αυτοκίνητο που βλέπετε (ένα παράδειγμα της κατηγορίας αυτοκινήτου) έχει ζάντες αλουμινίου.

Στον αντικειμενοστραφή προγραμματισμό, ορίζετε την τάξη μόνοι σας και μέσα στην τάξη, ορίζετε ένα πεδίο του τύπου «χρώμα». Όποτε το μάθημα δημιουργείται, η μνήμη διατηρείται αυτόματα για το χρώμα στο backend και αργότερα, μπορείτε να δώσετε σε αυτήν μια συγκεκριμένη τιμή (για παράδειγμα κόκκινο). Δεδομένου ότι αυτά τα χαρακτηριστικά είναι συγκεκριμένα, είναι μη στατικά.

Αντίθετα, οι στατικές μέθοδοι και τα πεδία κοινοποιούνται σε όλες τις παρουσίες. Αυτά κατασκευάζονται για αξία ή αντικείμενα που είναι ειδικά για την τάξη και όχι για την ίδια την παρουσία. Για μεθόδους, μπορεί να υπάρχουν καθολικές μέθοδοι (για παράδειγμα, μετατροπέας stringtoInt) και για πεδία, είναι συνήθως σταθερές σύμφωνα με τον κωδικό σας (για παράδειγμα, ο τύπος αυτοκινήτου μπορεί να είναι στατικός εάν κατασκευάζετε μόνο κανονικά αυτοκίνητα).

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

Πρόβλημα 1: Καλείτε κάτι που δεν υπάρχει

Συναντήσαμε ορισμένες περιπτώσεις όπου οι χρήστες χρησιμοποιούν μεταξύ τους στατικές και μη στατικές μεθόδους. Όταν το κάνουμε αυτό, θα πρέπει να προσέχετε ποια μέθοδος ονομάζει τι (σε ​​όρους στατικού ή όχι). Ρίξτε μια ματιά στον ακόλουθο κώδικα:

private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// Η ακόλουθη δήλωση προκαλεί το σφάλμα. Ξέρετε γιατί .. java.util.List someList = someMethod (); }

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

Συνοψίζοντας, δεν μπορείτε να καλέσετε κάτι που δεν υπάρχει. Επειδή ενδέχεται να μην έχετε δημιουργήσει ένα αντικείμενο, η μη στατική μέθοδος δεν υπάρχει ακόμη. Ωστόσο, από την άλλη πλευρά, μια στατική μέθοδος θα υπάρχει πάντα (λόγω ορισμού).

Θέμα 2: Οι μέθοδοι δεν είναι στατικές

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

δημόσια τάξη BookStoreApp2 {// σταθερές για επιλογές Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // δήλωση στοιχείου πίνακα = νέο BookStoreItem [10]; // αρχικοποίηση πίνακα int itemType = -1; printMenu (); getUserChoice (); για (int i = 0; i <item.length; i ++) {} // end of switch statement} // end of for loop για (int i = 0; i <item.length; i ++) {} // end του for} // τέλος της κύριας μεθόδου

Εδώ σε αυτόν τον κώδικα, πρέπει να μετατρέψετε και τις δύο μεθόδους printMenu () και getUserChoice () σε στατικές μεθόδους.

Ως εκ τούτου, εάν θέλετε να ξεπεράσετε μια κατάσταση όπως αυτή, μπορείτε να χρησιμοποιήσετε ένα κατασκευαστής αντι αυτου. Για παράδειγμα, μπορείτε να πάρετε το περιεχόμενο της κύριας μεθόδου () και να τα τοποθετήσετε μέσα σε έναν κατασκευαστή.

public BookStoreApp2 () {// Βάλτε τα περιεχόμενα της κύριας μεθόδου εδώ} Αφού το κάνετε αυτό, κάντε τα εξής μέσα στην κύρια μέθοδο (): public void main (String [] args) {new BookStoreApp2 (); }

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

$config[zx-auto] not found$config[zx-overlay] not found