1. Statiske metoder
I tillegg til statiske variabler kan klasser også ha statiske metoder.
Vanlige metoder er bundet til objekter (forekomster) av en klasse og kan referere til vanlige (ikke-statiske) variabler i klassen (så vel som statiske variabler og metoder ). Statiske metoder er bundet til klassens statiske objekt og kan bare få tilgang til de statiske variablene og/eller andre statiske metoder i klassen.
For å kalle en vanlig (ikke-statisk) metode på en klasse, må du først opprette et objekt av klassen og deretter kalle metoden på objektet. Du kan ikke kalle en vanlig metode på klassen i stedet for et objekt.
Eksempel:
Du kan ikke kalle en ikke-statisk metode på en klasse! |
---|
|
Men for å kalle en statisk metode, er det nok at klassens statiske objekt ganske enkelt eksisterer (og det eksisterer alltid etter at klassen er lastet inn i minnet). Dette er grunnen til at main()-metoden er statisk. Den er bundet til klassens statiske objekt, så du trenger ikke lage noen objekter for å kalle den.
For å erklære en metode statisk, må du skrive det statiske nøkkelordet før metodeoverskriften. Det generelle utseendet til denne konstruksjonen er som følger:
static Type name(parameters)
{
method code
}
Eksempler:
Kode | Merk |
---|---|
|
Java-maskinen kaller main metoden med en kommando som denne: Solution.main() ; Den statiske test() metoden kalles i den statiske main() metoden. |
For å kalle en statisk metode fra en annen klasse, må du spesifisere klassenavnet før navnet på den statiske metoden. Det generelle utseendet til denne konstruksjonen er som følger:
Type name = ClassName.methodName(arguments)
Eksempler:
Kode | Statisk metode |
---|---|
|
|
|
|
|
|
2. Statiske vs vanlige (ikke-statiske) metoder
Hva er forskjellen mellom statiske metoder og vanlige?
En vanlig metode er bundet til et vanlig objekt (en forekomst av en klasse), mens en statisk metode ikke er det. En vanlig metode kan få tilgang til variabler i sin instans, men en statisk metode kan ikke: den har rett og slett ikke en tilknyttet instans.
Forskjellene mellom de to typene metoder er uttrykt i følgende tabell:
Evne/egenskap | Vanlig metode | Statisk metode |
---|---|---|
Bundet til en forekomst av klassen | Ja | Nei |
Kan kalle vanlige metoder i klassen | Ja | Nei |
Kan kalle statiske metoder for klassen | Ja | Ja |
Kan få tilgang til vanlige variabler i klassen | Ja | Nei |
Kan få tilgang til statiske variabler i klassen | Ja | Ja |
Kan kalles på et objekt | Ja | Ja |
Kan kalles på klassen | Nei | Ja |
Hvorfor trengs slike metoder hvis de er så sterkt begrenset? Svaret er at denne tilnærmingen også har sine fordeler.
For det første trenger du ikke sende noen objektreferanse for å få tilgang til statiske metoder og variabler.
For det andre, noen ganger trenger du at det bare er en enkelt forekomst av en variabel. For eksempel System.out
( System-klassens statiske ut-variabel ).
Og for det tredje, noen ganger må du kalle en metode før det i det hele tatt er mulig å lage objekter. For eksempel kaller Java-maskinen main()-metoden for å starte kjøringen av programmet selv før en forekomst av klassen er opprettet.
Bundet til en forekomst av klassen
Når en vanlig metode kalles, sendes et argument - objektet som metoden kalles på - implisitt til den. Denne parameteren kalles this
. Denne implisitte parameteren (en referanse til objektet som metoden kalles på) skiller vanlige metoder fra statiske.
Statiske metoder har ikke denne implisitte parameteren, så du kan ikke bruke nøkkelordet this
i statiske metoder, og du kan ikke kalle en ikke-statisk metode i en statisk metode. Det er rett og slett ingen steder å få en referanse til en forekomst av en klasse.
Kan kalle vanlige metoder i klassen
En vanlig metode har alltid den implisitte this
parameteren, så du har alltid en referanse til objektet som metoden kalles på. Hver gang du kaller en ordinær metode i en annen ordinær metode, this
brukes den implisitte parameteren til å gjøre det kallet. Eksempel
Kode | Hvordan det fungerer |
---|---|
|
|
Det er derfor du ikke kan kalle en vanlig metode fra en statisk. Det er rett og slett ingen implisitt variabel navngitt this
i en statisk metode.
Eller forestill deg en annen situasjon: ikke et eneste objekt i klassen vår har ennå blitt opprettet i programmet vårt. Kan vi kalle en statisk metode for klassen vår? Ja. Og kan denne statiske metoden kalle en vanlig (ikke-statisk) metode?
Vel, hvilket objekt skulle vi kalle det på? Tross alt, ikke en eneste forekomst av klassen vår eksisterer ennå!
Kan kalle statiske metoder for klassen
Statiske metoder kan kalles fra hvor som helst - fra hvilket som helst sted i programmet. Dette betyr at de kan kalles fra både statiske metoder og vanlige. Det er ingen begrensninger her.
Kan få tilgang til vanlige variabler i klassen
Du kan få tilgang til vanlige variabler for en klasse fra en vanlig metode, siden den enkelt kan få en referanse til en forekomst av klassen via den implisitte this
parameteren.
En statisk metode vet ikke hvilken forekomst av klassen den skal bruke for å få verdier av vanlige variabler. Og mer generelt kan vi lett ha en situasjon der en statisk metode kalles, men ikke en eneste forekomst av klassen er opprettet i programmet ennå.
Som et resultat kan ikke statiske metoder få tilgang til vanlige variabler i en klasse.
Anta at en statisk metode kaller en vanlig metode. Hvilket objekt skal den vanlige metoden kalles på?
Ingen vet! Det er derfor du ikke kan kalle en vanlig metode fra en statisk uten å sende inn en referanse til et objekt!
Kan få tilgang til statiske variabler i klassen
Situasjonen med kall til statiske variabler er den samme som med kall til statiske metoder. Statiske variabler kan nås fra hvor som helst i programmet. Det betyr at du kan få tilgang til dem fra statiske og vanlige metoder.
Kan kalles på et objekt
Både statiske og ordinære metoder kan kalles på et objekt. Et vanlig metodekall er mulig - det er faktisk den eneste måten å kalle en vanlig metode. En statisk metode kan også kalles på et objekt: i dette tilfellet bestemmer kompilatoren selv typen av variabelen og kaller den statiske metoden basert på typen:
Kode | Hvordan kompilatoren ser det |
---|---|
|
|
|
|
|
|
Kan kalles på klassen
Du kan bare kalle en statisk metode på en klasse. For å kalle en vanlig metode trenger du en referanse til en forekomst av klassen. Derfor kan du ikke kalle en vanlig metode ved å bruke denne konstruksjonen:ClassName.methodName(arguments)
GO TO FULL VERSION