1. Statiske metoder

Ud over statiske variable kan klasser også have statiske metoder.

Regulære metoder er bundet til objekter (instanser) af en klasse og kan henvise til almindelige (ikke-statiske) variabler i klassen (såvel som statiske variabler og metoder ). Statiske metoder er bundet til klassens statiske objekt og kan kun få adgang til klassens statiske variable og/eller andre statiske metoder.

For at kalde en almindelig (ikke-statisk) metode på en klasse, skal du først oprette et objekt af klassen og derefter kalde metoden på objektet. Du kan ikke kalde en almindelig metode på klassen i stedet for et objekt.

Eksempel:

Du kan ikke kalde en ikke-statisk metode på en klasse!
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!
   }
}

Men for at kalde en statisk metode er det nok, at klassens statiske objekt simpelthen eksisterer (og det eksisterer altid efter klassen er indlæst i hukommelsen). Dette er grunden til, at main() metoden er statisk. Det er bundet til klassens statiske objekt, så du behøver ikke oprette nogen objekter for at kalde det.

For at erklære en metode statisk skal du skrive det statiske nøgleord før metodehovedet. Det generelle udseende af denne konstruktion er som følger:

static Type name(parameters)
{
   method code
}

Eksempler:

Kode Bemærk
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

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


Java-maskinen kalder mainmetoden med en kommando som denne: Solution.main();



Den statiske test()metode kaldes i den statiske main()metode.

For at kalde en statisk metode fra en anden klasse, skal du angive klassenavnet før navnet på den statiske metode. Det generelle udseende af denne konstruktion er som følger:

Type name = ClassName.methodName(arguments)

Eksempler:

Kode Statisk metode
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. Statiske vs almindelige (ikke-statiske) metoder

Hvad er forskellen mellem statiske metoder og almindelige?

En almindelig metode er bundet til et almindeligt objekt (en forekomst af en klasse), mens en statisk metode ikke er det. En almindelig metode kan få adgang til variabler i sin instans, men en statisk metode kan ikke: den har simpelthen ikke en tilknyttet instans.

Forskellene mellem de to typer metoder er udtrykt i følgende tabel:

Evne/egenskab Almindelig metode Statisk metode
Bundet til en forekomst af klassen Ja Ingen
Kan kalde klassens almindelige metoder Ja Ingen
Kan kalde statiske metoder i klassen Ja Ja
Kan få adgang til almindelige variabler i klassen Ja Ingen
Kan få adgang til klassens statiske variable Ja Ja
Kan kaldes på et objekt Ja Ja
Kan kaldes på klassen Ingen Ja

Hvorfor er sådanne metoder nødvendige, hvis de er så stærkt begrænsede? Svaret er, at denne tilgang også har sine fordele.

For det første behøver du ikke sende nogen objektreference for at få adgang til statiske metoder og variabler.

For det andet, nogle gange har du brug for, at der kun er en enkelt forekomst af en variabel. For eksempel System.out( System-klassens statiske ud-variabel ).

Og for det tredje, nogle gange skal du kalde en metode, før det overhovedet er muligt at oprette objekter. For eksempel kalder Java-maskinen main()-metoden for at starte udførelsen af ​​programmet, selv før en forekomst af klassen er oprettet.

Bundet til en forekomst af klassen

Når en almindelig metode kaldes, overføres et argument - det objekt, som metoden kaldes på - implicit til den. Denne parameter kaldes this. Denne implicitte parameter (en reference til det objekt, som metoden kaldes på) adskiller almindelige metoder fra statiske.

Statiske metoder har ikke denne implicitte parameter, så du kan ikke bruge nøgleordet thisi statiske metoder, og du kan ikke kalde en ikke-statisk metode i en statisk metode. Der er simpelthen ingen steder at få en reference til en forekomst af en klasse.

Kan kalde klassens almindelige metoder

En almindelig metode har altid den implicitte thisparameter, så du har altid en reference til det objekt, som metoden kaldes på. Når du kalder en almindelig metode inde i en anden almindelig metode, thisbruges den implicitte parameter til at foretage dette kald. Eksempel

Kode Hvordan det virker
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);
}

Derfor kan man ikke kalde en almindelig metode fra en statisk. Der er simpelthen ingen implicit variabel navngivet thisinde i en statisk metode.

Eller forestil dig en anden situation: ikke et eneste objekt fra vores klasse er endnu blevet oprettet i vores program. Kan vi kalde en statisk metode i vores klasse? Ja. Og kan denne statiske metode kalde en almindelig (ikke-statisk) metode?

Nå, hvilket objekt ville vi kalde det på? Der findes trods alt ikke en eneste forekomst af vores klasse endnu!

Kan kalde statiske metoder i klassen

Statiske metoder kan kaldes fra hvor som helst - fra et hvilket som helst sted i programmet. Det betyder, at de kan kaldes fra både statiske metoder og almindelige. Der er ingen begrænsninger her.

Kan få adgang til almindelige variabler i klassen

Du kan få adgang til almindelige variabler for en klasse fra en almindelig metode, da den nemt kan få en reference til en forekomst af klassen via den implicitte thisparameter.

En statisk metode ved ikke, hvilken forekomst af klassen den skal bruge til at få værdier af almindelige variabler. Og mere generelt kan vi sagtens have en situation, hvor en statisk metode kaldes, men der endnu ikke er oprettet en eneste forekomst af klassen i programmet.

Som et resultat kan statiske metoder ikke få adgang til almindelige variabler i en klasse.

Antag, at en statisk metode kalder en almindelig metode. Hvilken genstand skal den almindelige metode kaldes på?

Statiske metoder

Ingen ved! Derfor kan du ikke kalde en almindelig metode fra en statisk uden at sende en reference til et objekt!

Kan få adgang til klassens statiske variable

Situationen med kald til statiske variable er den samme som med kald til statiske metoder. Statiske variabler kan tilgås fra hvor som helst i programmet. Det betyder, at du kan få adgang til dem fra statiske og almindelige metoder.

Kan kaldes på et objekt

Både statiske og almindelige metoder kan kaldes på et objekt. Et almindeligt metodekald muligt - ja, det er den eneste måde at kalde en almindelig metode. En statisk metode kan også kaldes på et objekt: i dette tilfælde bestemmer compileren selv typen af ​​variablen og kalder den statiske metode baseret på dens type:

Kode Hvordan compileren ser det
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 kaldes på klassen

Du kan kun kalde en statisk metode på en klasse. For at kalde en almindelig metode skal du have en reference til en forekomst af klassen. Derfor kan du ikke kalde en almindelig metode ved hjælp af denne konstruktion:ClassName.methodName(arguments)