Επισκευή: Η μη στατική μέθοδος δεν μπορεί να αναφερθεί από ένα στατικό πλαίσιο

Πολλοί προγραμματιστές αντιμετωπίζουν το μήνυμα σφάλματος " Μη στατική μέθοδος δεν μπορεί να αναφέρεται από ένα στατικό περιβάλλον " όταν κωδικοποιεί. Αυτό το μήνυμα σφάλματος δεν είναι συγκεκριμένο και μπορεί να παρουσιαστεί σε οποιοδήποτε IDE εάν οι συνθήκες για το σφάλμα είναι αληθές.

Η μη στατική μέθοδος δεν μπορεί να αναφερθεί από ένα στατικό πλαίσιο

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

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

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

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

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

 τάξη μαθητών {int roll_no; Όνομα συμβολοσειράς. στατικό κολέγιο String = "InformationTech"; static void change () {college = "Διαχείριση";} Φοιτητές (int αριθμός, String name_self) {roll_no = αριθμός; όνομα = όνομα_επίσης;} άκυρη εμφάνιση () {System.out.println (rollno + (Students.change ()) Students stu_1 = Νέοι σπουδαστές (100, "Μεξικάνικες") Students stu_2 = Νέοι σπουδαστές (202, Αμερικανικοί) Students stu_3 = νέοι σπουδαστές (309, "βρετανικά"), stu_1.display (), stu_2.display (), stu_3.display (), }} 

Η παραγωγή του προγράμματος θα είναι:

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

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

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

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

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

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

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

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

Θέμα 1: Καλείτε κάτι που δεν υπάρχει

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

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

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

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

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

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

 δημόσια τάξη BookStoreApp2 {// σταθερές για τις επιλογές Scanner input = new Scanner (System.in); Δημόσια στατική κενή κεντρική (String [] args) {BookStoreItem [] στοιχείο? // Δηλώνοντας το στοιχείο array = new BookStoreItem [10]; // Αρχικοποίηση array int itemType = -1; printMenu (); getUserChoice (); για το (int i = 0, i <item.length; i ++) {} // τέλος του statement διακόπτη} // τέλος του για το βρόχο για (int i = 0; i <item.length; i ++) {} του για // // τέλος της κύριας μεθόδου 

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

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

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

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

Ενδιαφέροντα Άρθρα