Oplossing: niet-statische methode kan niet worden verwezen vanuit een statische context
Veel programmeurs worden geconfronteerd met de foutmelding ‘Er kan niet naar een niet-statische methode worden verwezen vanuit een statische context’Wanneer ze coderen. Dit foutbericht is niet specifiek en kan in elke IDE voorkomen als aan de voorwaarden voor de fout wordt voldaan.
Dit is een veel voorkomende fout voor beginners, waarbij de programmeur een klasse 'statisch' probeert te gebruiken zonder een instantie van de klasse te maken. Er zijn verschillende voorwaarden waaraan moet worden voldaan als u een klasse gebruikt die statisch is. In dit artikel zullen we verschillende gevallen doornemen en u begeleiden bij het gebruik van een statische klasse.
Wat is een statische methode?
Door het zoekwoord ‘statisch’ aan een methode toe te voegen, wordt de methode bekend als een statische methode. Een statische methode hoort bij de klasse in plaats van bij een object (wat de norm is). Een statische methode kan gemakkelijk worden aangeroepen zonder de voorwaarde dat er een instantie van een klasse moet worden gemaakt.
Er zijn verschillende manieren om statische methoden te gebruiken. U kunt er bijvoorbeeld een statisch gegevenslid en de waarde van wijzigen. Er zijn echter nog enkele beperkingen bij het gebruik van een statische methode. Als u bijvoorbeeld toegang wilt tot niet-statische velden van uw klasse, moet u een niet-statische methode gebruiken. Kortom, statische methoden worden zeer schaars 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.
class Studenten {int roll_no; String naam; static String college = "InformationTech"; static void change () {college = "Management";} Studenten (int nummer, String name_self) {roll_no = number; name = name_self;} void display () {System.out.println (rollno + "" + name + "" + 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, "Brits"); 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 van ‘auto’s’ behoort die je al kent. Beschouw klasse hier als een sjabloon of een idee.
Als je nu dichterbij komt, zie je het model en merk van de auto. Hier herken je de ‘instantie’ van de klasse ‘auto’. Hier zullen alle eigendommen tot in detail aanwezig zijn; de wielen, het vermogen, de velgen etc.
Een voorbeeld van eigenschappen kan zijn dat in de klasse ‘auto’ staat dat alle auto's wielen moeten hebben. De auto die u ziet (een exemplaar uit de autoklasse) heeft lichtmetalen velgen.
Bij objectgeoriënteerd programmeren definieer je zelf de klasse en binnen de klas definieer je een veld van het type ‘kleur’. Telkens wanneer de klasse wordt geïnstantieerd, wordt automatisch geheugen gereserveerd voor de kleur aan de achterkant en later kunt u deze een specifieke waarde geven (bijvoorbeeld rood). Aangezien dit soort attributen specifiek zijn, zijn ze niet-statisch.
Daarentegen worden statische methoden en velden met alle instanties gedeeld. 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 autotype kan bijvoorbeeld statisch zijn als u alleen normale auto's maakt).
Nu zullen we kijken naar alle verschillende gevallen waarin uw codering fout kan gaan en de tijdelijke oplossingen bekijken om ze op te lossen.
Probleem 1: u 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 aanroept (in termen van statisch of niet). Bekijk de volgende code:
privé java.util.ListsomeMethod () {/ * 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 kapselen we de data in samen met de data waarmee 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.
Kortom, je kunt niet iets bellen dat niet bestaat. Aangezien u mogelijk nog geen object heeft gemaakt, bestaat de niet-statische methode nog niet. Aan de andere kant zal er echter altijd een statische methode bestaan (vanwege de definitie).
Probleem 2: methoden worden niet statisch gemaakt
Als u methoden aanroept vanuit uw Statische hoofdmethode zonder een instantie van de methoden te maken, krijgt u een foutmelding. Hier geldt hetzelfde principe; 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; // array-item declareren = nieuw BookStoreItem [10]; // array int itemType = -1; printMenu(); getUserChoice (); for (int i = 0; iHier in deze code moet u beide methoden converteren printMenu () en getUserChoice () in statische methoden.
Dus als u een situatie als deze wilt omzeilen, kunt u een constructeur in plaats daarvan. U kunt bijvoorbeeld de inhoud van uw methode main () nemen en deze in een constructor plaatsen.
public BookStoreApp2 () {// Plaats hier de inhoud van de hoofdmethode} Nadat je dit hebt gedaan, doe je het volgende in je methode main (): public void main (String [] args) {new BookStoreApp2 (); }Als deze tips niet werken op uw code of als uw code anders is, moet u de basisprincipes van statische klassen en methoden in gedachten houden en uw code opnieuw controleren om er zeker van te zijn dat het basisprincipe niet wordt geschonden.