Oplossing: niet-statische methode kan niet worden gebruikt vanuit een statische context

Veel programmeurs worden geconfronteerd met de foutmelding 'Er kan niet naar een statische methode worden verwezen vanuit een statische context ' wanneer ze coderen. Dit foutbericht is niet specifiek en kan in elke IDE voorkomen als de voorwaarden voor de fout waar zijn.

Niet-statische methode Er kan niet naar worden verwezen vanuit een statische context

Dit is een veel voorkomende fout voor beginners waarbij de programmeur een klasse 'statisch' probeert te gebruiken zonder een instantie van de klas te maken. Er zijn verschillende voorwaarden waaraan moet worden voldaan wanneer u een statische klasse gebruikt. In dit artikel zullen we verschillende cases behandelen en u begeleiden bij het gebruik van een statische klasse.

Wat is een statische methode?

Door het trefwoord 'statisch' aan een willekeurige methode toe te voegen, wordt de methode een statische methode genoemd. Een statische methode behoort tot de klasse in plaats van tot een object (wat de norm is). Een statische methode kan eenvoudig worden ingeroepen zonder de voorwaarde dat een instantie van een klasse wordt gemaakt.

Er zijn verschillende toepassingen van statische methoden, u kunt bijvoorbeeld een statisch gegevenslid en de waarde ervan wijzigen. Er zijn echter nog enkele beperkingen bij het gebruik van een statische methode. Als u bijvoorbeeld toegang wilt krijgen tot niet-statische velden van uw klasse, moet u een niet-statische methode gebruiken. Kortom, statische methoden worden zeer spaarzaam gebruikt, maar ze hebben wel hun voordelen.

Hier is een kort voorbeeld van hoe een statische methode kan worden gemaakt om de eigenschap van alle objecten te wijzigen.

 klas Studenten {int roll_no; String naam; statische String college = "InformationTech"; statische ongeldige wijziging () {college = "Management";} Studenten (int. nummer, tekenreeks naam_zelf) {roll_no = nummer; naam = naam_zelf;} void display () {System.out.println (rollno + "" + naam + "" + college);} public static void main (String args []) {Students.change (); Students stu_1 = new Students (100, "Mexican"); Students stu_2 = new Students (202, "American"); Students stu_3 = nieuwe studenten (309, "British"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

De output van het programma zal zijn:

 100 Mexicaans management 202 Amerikaans management 309 Brits management 

Wat is het verschil tussen een klasse en een instantie van een klasse?

Denk dat je op straat loopt en je ziet een auto. Nu weet je meteen dat dit een auto is, zelfs als je niet weet wat het model of type is. Dit komt omdat je weet dat dit tot de klasse 'auto's' behoort die je al kent. Beschouw klasse hier als een sjabloon of een idee.

Nu je dichterbij komt, zie je het model en het merk van de auto. Hier herkent u het 'exemplaar' van de klasse 'auto'. Hier zullen alle eigenschappen in detail aanwezig zijn; de wielen, het vermogen, de velgen etc.

Een voorbeeld van eigenschappen kan zijn dat de klasse 'auto' aangeeft dat alle auto's wielen moeten hebben. De auto die u ziet (een exemplaar van de autoklasse) heeft lichtmetalen velgen.

In objectgeoriënteerd programmeren definieert u zelf de klasse en binnen de klasse definieert u een veld van het type 'kleur'. Wanneer de klasse wordt geïnstantieerd, wordt geheugen automatisch gereserveerd voor de kleur aan de backend en later kunt u dit een specifieke waarde geven (bijvoorbeeld rood). Omdat kenmerken zoals deze specifiek zijn, zijn ze niet-statisch.

Statische methoden en velden worden daarentegen gedeeld met alle instanties. Deze zijn gemaakt voor waarde of items die specifiek zijn voor de klasse en niet voor de instantie zelf. Voor methoden kunnen er globale methoden zijn (bijvoorbeeld stringtoInt converter) en voor velden zijn dit meestal constanten volgens uw code (het type auto kan bijvoorbeeld statisch zijn als u alleen normale auto's maakt).

Nu zullen we alle verschillende gevallen bekijken waarin uw codering fout kan gaan en de oplossingen bekijken om ze te repareren.

Probleem 1: Je belt iets dat niet bestaat

We kwamen enkele gevallen tegen waarin gebruikers zowel statische als niet-statische methoden met elkaar gebruikten. Wanneer we dit doen, moet u voorzichtig zijn met welke methode wat noemt (statisch of niet). Bekijk de volgende code:

 private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// De volgende instructie veroorzaakt de fout. Je weet waarom ... java.util.List someList = someMethod (); } 

Hier roept de statische methode someMethod aan. Bij objectgeoriënteerd programmeren bevatten we de gegevens samen met de gegevens waarop we willen werken. Hier, zonder een object, zijn er geen instantiegegevens en hoewel de instantiemethoden bestaan ​​als onderdeel van de klassedefinitie, moet er altijd een objectinstantie zijn om hen gegevens te verstrekken.

Samenvattend kun je dus niet iets noemen dat niet bestaat. Aangezien u mogelijk nog geen object hebt gemaakt, bestaat de niet-statische methode nog niet. Aan de andere kant zal er altijd een statische methode bestaan ​​(vanwege de definitie).

Probleem 2: Methoden worden niet statisch gemaakt

Als u methoden uit uw statische hoofdmethode aanroept zonder een instantie van de methoden te maken, krijgt u een foutmelding. Hier is hetzelfde principe van toepassing; je hebt geen toegang tot iets dat niet bestaat.

 openbare klasse BookStoreApp2 {// constanten voor opties Scannerinvoer = nieuwe scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // declaring array item = new BookStoreItem [10]; // initialiseren van array int itemType = -1; printMenu (); getUserChoice (); voor (int i = 0; i <item.length; i ++) {} // einde van schakelinstructie} // einde van for lus voor (int i = 0; i <item.length; i ++) {} // einde van voor} // einde van hoofdmethode 

Hier in deze code moet u zowel de methoden printMenu () als getUserChoice () omzetten in statische methoden.

Als u een situatie als deze wilt omzeilen, kunt u in plaats daarvan een constructor gebruiken. U kunt bijvoorbeeld de inhoud van uw main () -methode nemen en deze in een constructor plaatsen.

 public BookStoreApp2 () {// Plaats de inhoud van de hoofdmethode hier} Doe daarna het volgende in uw main () -methode: public void main (String [] args) {new BookStoreApp2 (); } 

Als deze tips niet werken op uw of uw code anders is, moet u rekening houden met de basisprincipes van statische klassen en methoden en uw code opnieuw controleren om ervoor te zorgen dat het basisprincipe niet wordt geschonden.

Interessante Artikelen