1. Statiska metoder
Förutom statiska variabler kan klasser även ha statiska metoder.
Vanliga metoder är bundna till objekt (instanser) av en klass och kan referera till vanliga (icke-statiska) variabler i klassen (liksom statiska variabler och metoder ). Statiska metoder är bundna till klassens statiska objekt och kan endast komma åt klassens statiska variabler och/eller andra statiska metoder.
För att anropa en vanlig (icke-statisk) metod på en klass måste du först skapa ett objekt av klassen och sedan anropa metoden på objektet. Du kan inte anropa en vanlig metod på klassen snarare än ett objekt.
Exempel:
Du kan inte anropa en icke-statisk metod på en klass! |
---|
|
Men för att anropa en statisk metod räcker det att klassens statiska objekt helt enkelt existerar (och det finns alltid efter att klassen har laddats in i minnet). Det är därför main()-metoden är statisk. Det är bundet till klassens statiska objekt, så du behöver inte skapa några objekt för att anropa det.
För att deklarera en metod statisk måste du skriva det statiska nyckelordet före metodhuvudet. Det allmänna utseendet för denna konstruktion är som följer:
static Type name(parameters)
{
method code
}
Exempel:
Koda | Notera |
---|---|
|
Java-maskinen anropar main metoden med ett kommando så här: Solution.main() ; Den statiska test() metoden kallas i den statiska main() metoden. |
För att anropa en statisk metod från en annan klass måste du ange klassnamnet före namnet på den statiska metoden. Det allmänna utseendet för denna konstruktion är som följer:
Type name = ClassName.methodName(arguments)
Exempel:
Koda | Statisk metod |
---|---|
|
|
|
|
|
|
2. Statiska kontra vanliga (icke-statiska) metoder
Vad är skillnaden mellan statiska metoder och vanliga?
En vanlig metod är bunden till ett vanligt objekt (en instans av en klass), medan en statisk metod inte är det. En vanlig metod kan komma åt variabler i sin instans, men en statisk metod kan inte: den har helt enkelt inte en associerad instans.
Skillnaderna mellan de två typerna av metoder uttrycks i följande tabell:
Förmåga/egenskap | Vanlig metod | Statisk metod |
---|---|---|
Bundet till en instans av klassen | Ja | Nej |
Kan anropa vanliga metoder i klassen | Ja | Nej |
Kan anropa statiska metoder för klassen | Ja | Ja |
Kan komma åt vanliga variabler i klassen | Ja | Nej |
Kan komma åt statiska variabler för klassen | Ja | Ja |
Kan anropas på ett objekt | Ja | Ja |
Kan ringas på klassen | Nej | Ja |
Varför behövs sådana metoder om de är så kraftigt begränsade? Svaret är att detta tillvägagångssätt också har sina fördelar.
För det första behöver du inte skicka någon objektreferens för att komma åt statiska metoder och variabler.
För det andra, ibland behöver du bara finnas en enda instans av en variabel. Till exempel System.out
( Systemklassens statiska utvariabel ) .
Och för det tredje, ibland behöver du anropa en metod innan det ens är möjligt att skapa objekt. Till exempel anropar Java-maskinen main()-metoden för att starta exekveringen av programmet redan innan en instans av klassen skapas.
Bundet till en instans av klassen
När en vanlig metod anropas skickas ett argument - objektet som metoden anropas på - implicit till den. Denna parameter kallas this
. Denna implicita parameter (en referens till objektet som metoden kallas) skiljer vanliga metoder från statiska.
Statiska metoder har inte denna implicita parameter, så du kan inte använda nyckelordet this
i statiska metoder, och du kan inte anropa en icke-statisk metod i en statisk metod. Det finns helt enkelt ingenstans att få en referens till en instans av en klass.
Kan anropa vanliga metoder i klassen
En vanlig metod har alltid den implicita this
parametern, så du har alltid en referens till objektet som metoden anropas på. När du anropar en vanlig metod inom en annan vanlig metod, this
används den implicita parametern för att göra det anropet. Exempel
Koda | Hur det fungerar |
---|---|
|
|
Det är därför man inte kan kalla en vanlig metod från en statisk. Det finns helt enkelt ingen implicit variabel namngiven this
inuti en statisk metod.
Eller föreställ dig en annan situation: inte ett enda objekt i vår klass har ännu skapats i vårt program. Kan vi kalla en statisk metod för vår klass? Ja. Och kan denna statiska metod kalla en vanlig (icke-statisk) metod?
Nåväl, vilket objekt skulle vi kalla det för? Det finns trots allt inte en enda instans av vår klass ännu!
Kan anropa statiska metoder för klassen
Statiska metoder kan anropas var som helst - från vilken plats som helst i programmet. Det betyder att de kan anropas från både statiska metoder och vanliga. Det finns inga begränsningar här.
Kan komma åt vanliga variabler i klassen
Du kan komma åt vanliga variabler för en klass från en vanlig metod, eftersom den enkelt kan få en referens till en instans av klassen via den implicita this
parametern.
En statisk metod vet inte vilken instans av klassen den ska använda för att få värden på vanliga variabler. Och mer generellt kan vi lätt ha en situation där en statisk metod anropas men inte en enda instans av klassen ännu har skapats i programmet.
Som ett resultat kan statiska metoder inte komma åt vanliga variabler i en klass.
Antag att en statisk metod anropar en vanlig metod. Vilket objekt ska den vanliga metoden kallas?
Ingen vet! Det är därför du inte kan anropa en vanlig metod från en statisk utan att skicka in en referens till ett objekt!
Kan komma åt statiska variabler för klassen
Situationen med anrop till statiska variabler är densamma som med anrop till statiska metoder. Statiska variabler kan nås från var som helst i programmet. Det betyder att du kan komma åt dem från statiska och vanliga metoder.
Kan anropas på ett objekt
Både statiska och vanliga metoder kan anropas på ett objekt. Ett vanligt metodanrop är möjligt - det är faktiskt det enda sättet att anropa en vanlig metod. En statisk metod kan också anropas på ett objekt: i det här fallet bestämmer kompilatorn själv typen av variabel och anropar den statiska metoden baserat på dess typ:
Koda | Hur kompilatorn ser det |
---|---|
|
|
|
|
|
|
Kan ringas på klassen
Du kan bara anropa en statisk metod på en klass. För att anropa en vanlig metod behöver du en referens till en instans av klassen. Därför kan du inte anropa en vanlig metod med denna konstruktion:ClassName.methodName(arguments)
GO TO FULL VERSION