1. Statische methoden

Naast statische variabelen kunnen klassen ook statische methoden hebben.

Reguliere methoden zijn gebonden aan objecten (instanties) van een klasse en kunnen verwijzen naar gewone (niet-statische) variabelen van de klasse (evenals statische variabelen en methoden ). Statische methoden zijn gebonden aan het statische object van de klasse en hebben alleen toegang tot de statische variabelen en/of andere statische methoden van de klasse.

Om een ​​gewone (niet-statische) methode op een klasse aan te roepen, moet u eerst een object van de klasse maken en vervolgens de methode op het object aanroepen. U kunt geen gewone methode op de klasse aanroepen in plaats van een object.

Voorbeeld:

U kunt geen niet-statische methode op een klasse aanroepen!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Maar om een ​​statische methode aan te roepen, volstaat het dat het statische object van de klasse gewoon bestaat (en het bestaat altijd nadat de klasse in het geheugen is geladen). Daarom is de methode main() statisch. Het is gebonden aan het statische object van de klasse, dus u hoeft geen objecten te maken om het aan te roepen.

Om een ​​methode statisch te declareren, moet u het statische sleutelwoord voor de methodekop schrijven. Het algemene uiterlijk van dit construct is als volgt:

static Type name(parameters)
{
   method code
}

Voorbeelden:

Code Opmerking
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


De Java-machine roept de mainmethode aan met een commando als dit: Solution.main();



De statische test()methode wordt in de statische main()methode genoemd.

Om een ​​statische methode van een andere klasse aan te roepen, moet u de klassenaam opgeven vóór de naam van de statische methode. Het algemene uiterlijk van dit construct is als volgt:

Type name = ClassName.methodName(arguments)

Voorbeelden:

Code Statische methode
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Statische versus gewone (niet-statische) methoden

Wat is het verschil tussen statische methoden en gewone methoden?

Een gewone methode is gebonden aan een gewoon object (een instantie van een klasse), terwijl een statische methode dat niet is. Een gewone methode heeft toegang tot variabelen in zijn instantie, maar een statische methode kan dat niet: hij heeft simpelweg geen bijbehorende instantie.

De verschillen tussen de twee soorten methoden worden uitgedrukt in de volgende tabel:

Vermogen / eigendom Gewone methode Statische methode
Gebonden aan een instantie van de klasse Ja Nee
Kan gewone methoden van de klasse aanroepen Ja Nee
Kan statische methoden van de klasse aanroepen Ja Ja
Heeft toegang tot gewone variabelen van de klasse Ja Nee
Heeft toegang tot statische variabelen van de klasse Ja Ja
Kan op een object worden aangeroepen Ja Ja
Kan op de klas worden geroepen Nee Ja

Waarom zijn zulke methoden nodig als ze zo ernstig beperkt zijn? Het antwoord is dat deze aanpak ook zo zijn voordelen heeft.

Ten eerste hoeft u geen objectreferentie door te geven om toegang te krijgen tot statische methoden en variabelen.

Ten tweede, soms moet er maar één exemplaar van een variabele zijn. Bijvoorbeeld System.out( de statische out-variabele van de klasse System ).

En ten derde moet je soms een methode aanroepen voordat het zelfs maar mogelijk is om objecten te maken. De Java-machine roept bijvoorbeeld de methode main() aan om de uitvoering van het programma te starten nog voordat een instantie van de klasse is gemaakt.

Gebonden aan een instantie van de klasse

Wanneer een gewone methode wordt aangeroepen, wordt impliciet een argument - het object waarop de methode wordt aangeroepen - doorgegeven. Deze parameter heet this. Deze impliciete parameter (een verwijzing naar het object waarop de methode wordt aangeroepen) onderscheidt gewone methoden van statische.

Statische methoden hebben deze impliciete parameter niet, dus u kunt het sleutelwoord niet gebruiken thisbinnen statische methoden en u kunt geen niet-statische methode binnen een statische methode aanroepen. Er is simpelweg nergens een verwijzing naar een instantie van een klasse te krijgen.

Kan gewone methoden van de klasse aanroepen

Een gewone methode heeft altijd de impliciete thisparameter, dus je hebt altijd een verwijzing naar het object waarop de methode wordt aangeroepen. Telkens wanneer u een gewone methode aanroept binnen een andere gewone methode, thiswordt de impliciete parameter gebruikt om die aanroep te doen. Voorbeeld

Code Hoe het werkt
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

Daarom kun je geen gewone methode vanuit een statische methode aanroepen. Er is gewoon geen impliciete variabele genoemd thisin een statische methode.

Of stel je een andere situatie voor: er is nog geen enkel object van onze klasse in ons programma gemaakt. Kunnen we een statische methode van onze klasse noemen? Ja. En kan deze statische methode een gewone (niet-statische) methode aanroepen?

Wel, op welk object zouden we het noemen? Er bestaat tenslotte nog geen enkele instantie van onze klasse!

Kan statische methoden van de klasse aanroepen

Statische methoden kunnen overal worden aangeroepen - vanaf elke plek in het programma. Dit betekent dat ze kunnen worden aangeroepen vanuit zowel statische als gewone methoden. Er zijn hier geen beperkingen.

Heeft toegang tot gewone variabelen van de klasse

U hebt toegang tot gewone variabelen van een klasse via een gewone methode, aangezien deze gemakkelijk een verwijzing naar een instantie van de klasse kan verkrijgen via de impliciete thisparameter.

Een statische methode weet niet welke instantie van de klasse hij moet gebruiken om waarden van gewone variabelen op te halen. En meer in het algemeen kunnen we gemakkelijk een situatie hebben waarin een statische methode wordt aangeroepen, maar er is nog geen enkele instantie van de klasse in het programma gemaakt.

Als gevolg hiervan hebben statische methoden geen toegang tot gewone variabelen van een klasse.

Stel dat een statische methode een gewone methode aanroept. Op welk object moet die gewone methode worden aangeroepen?

Statische methoden

Niemand weet het! Daarom kun je geen gewone methode vanuit een statische methode aanroepen zonder een verwijzing naar een object door te geven!

Heeft toegang tot statische variabelen van de klasse

De situatie bij het aanroepen van statische variabelen is hetzelfde als bij het aanroepen van statische methoden. Statische variabelen zijn overal in het programma toegankelijk. Dat betekent dat u ze kunt openen via statische en gewone methoden.

Kan op een object worden aangeroepen

Zowel statische als gewone methoden kunnen op een object worden aangeroepen. Een gewone methodeaanroep mogelijk — inderdaad, dat is de enige manier om een ​​gewone methode aan te roepen. Een statische methode kan ook op een object worden aangeroepen: in dit geval bepaalt de compiler zelf het type variabele en roept de statische methode aan op basis van het type:

Code Hoe de compiler het ziet
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Kan op de klas worden geroepen

U kunt alleen een statische methode op een klasse aanroepen. Om een ​​gewone methode aan te roepen, heb je een verwijzing naar een instantie van de klasse nodig. Daarom kun je geen gewone methode aanroepen met deze constructie:ClassName.methodName(arguments)