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! |
---|
|
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 |
---|---|
|
Java-maskinen kalder main metoden 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 |
---|---|
|
|
|
|
|
|
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 this
i 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 this
parameter, 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, this
bruges den implicitte parameter til at foretage dette kald. Eksempel
Kode | Hvordan det virker |
---|---|
|
|
Derfor kan man ikke kalde en almindelig metode fra en statisk. Der er simpelthen ingen implicit variabel navngivet this
inde 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 this
parameter.
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å?
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 |
---|---|
|
|
|
|
|
|
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)
GO TO FULL VERSION