Hvad betyder Static, helt præcist?

Tags:    java

Hvad bruger man "static", til? Altså når man laver header til en metode? Hvad GØR static?



4 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 26 karma
Sorter efter stemmer Sorter efter dato
static metoder er også det man kalder for klassemetoder. For at forstå det skal man kende forskellen på en klasse og et objekt. En klasse er _beskrivelsen_ af en struktur, dvs. et skema af hvordan eksempelvis en bil ser ud. Når man har et objekt har man gjort sin klasse "virkelig" og lavet en konkret bil (eks.) ud af det. Det vil sige følgende

Fold kodeboks ind/udJava kode 


Dette er en enkel klasse med et skema der beskriver at en bil har en model man kan hente ved at kalde GetModel() metoden og sætte ved at kalde SetModel() metoden. Ikke noget statisk endnu.

Laver man en konkret bil - altså et objekt, fx. en Skoda, så gør man således:

Fold kodeboks ind/udJava kode 


myBil er nu et objekt af klassen Bil. Den har en helt konkret model som er skoda og jeg kan lave mange nye og forskellige biler ud fra samme klasse fx. Mercedes, Open, Fiat osv.

Lad og sige at jeg skal lave en metode der gælder for alle biler, dvs. den skal ikke gælde for den enkelte bil, men for biler generelt, lad os sige at jeg skal have en landekode for hvilket land alle bilerne tilhører. Jeg introducerer nu en statisk metode som findes på klassen (bemærk ikke på objektet) som en statisk metode, således:

Fold kodeboks ind/udJava kode 


Nu har jeg en statisk (klassemetode) på min bil som ikke gælder for en enkelt bil, men for alle biler. Det vil sige at jeg kan kalde:

Bil.GetLand(); og få "Danmark" tilbage

Fordi GetLand() er en klassemetode giver det ikke mening at kalde den inde fra et objekt (kun i visse situationer, fx. som nævnt ovenfor i singletons). Hvis man i ovenstående eksempel lavede en SetLand() metode og kaldte den med "Tyskland" vil man så også ændre det for alle og næste gang man kaldte GetLand() vil den ikke længere returnere "Danmark" men "Tyskland"

For mere omkring objektorienteret programmering se evt. start materialet for datalogi/softwareingeniør på Aalborg Universitet (afsnittet omkring klasser - klik til start for at se alt indholdet: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/classes_themes-init-ex-sect.html)

Håber det giver mening.

Du kan ikke bruge static-metoder fra et objekt, og du kan ikke bruge ikke-static metoder fra andet end et objekt.


Det er vist ikke helt rigtigt. Hvis det er objektorienteret programmering man arbejder med - hvor skulle man så kalde sin statiske metode fra, man har vel ikke noget der ikke er objekter?



Indlæg senest redigeret d. 16.03.2012 19:41 af Bruger #2730
hvis du har klassen Bob og metoden byggemand(), så vil du normalt skulle lave et objekt af Bob for at kunne bruge byggemand(). Således:
Fold kodeboks ind/udKode 


Men nogle gange kan du få brug for at kalde en specifik metode fra en klasse, uden først at have et objekt af klassen. Det kan fx være til implementation af et AbstractFactory. Der kan du så gøre metoden static, og derved kalde den uden at lave et objekt af Bob først. Således:
Fold kodeboks ind/udKode 


Du kan ikke bruge static-metoder fra et objekt, og du kan ikke bruge ikke-static metoder fra andet end et objekt.



Hvis ikke jeg tager fejl, så kan en klasse punkter() ha en static property punkterCount som er 'fælles' for alle objekter af klassen. Det lyder nyttigt, men man ville nok alligevel lave en containerklasse, hvor man i forvejen har bedre styr på 'count'.



Som et eks. bruger man static når man laver det der hedder en singleton, en singleton er lavet således at kun et aktivet objekt af en klasse kan eksistere i systemet. det vil sige hvis du har 2 modstående punkter i din app hvor du kalder den klasse som er singleton. så vil klasse retunere det samme objekt. dette bruges eks. til gui controllers eller database controllers. da man så ikke har en program som åbner multiple forbindelser.

Singleton: http://en.wikipedia.org/wiki/Singleton_pattern



Indlæg senest redigeret d. 16.03.2012 17:27 af Bruger #17032
t