Permalänk
Medlem

[Java]: Frågor om Static

Har en uppgift som ser ut som följande:

Skriv en publik metod reverse(int[] arr) som bygger upp, och returnerar, en ny heltals-array där alla element i arrayen arr finns i omvänd ordning. Arrayen arr skall lämnas opåverkad.

Min kod:
public class Reverse {

public int[] reverse(int[] arr){
int[] Arr = new int[arr.length];
int j=0;

for(int i=(arr.length-1); i>=0; i--){
Arr[j] = arr[i];
j++;
}
return Arr;
}
}

Min fråga är vad skillnaden är mellan att skriva som ovan eller att skriva såhär istället:
public static int[] reverse(int[] arr){
....
}

Visa signatur

"This is VAR, spelled A-U-T-O"

Permalänk

Skillnaden är att om du inte gör den statisk måste du skapa ett objekt av Reverse innan du kan anropa metoden. Det är bra ifall du vill ha olika properties per objekt av reverse som sedan används i funktionen reverse. T.ex. om du har ett id som du sätter innan du anropar reverse. Kör du en statisk kommer alla anrop till reverse att gå mot samma id (om du inte ändrar imellan).

Men så som din funktion ser ut så bör du köra den statisk

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk

Ett litet tillägg till KurreKulas förklaring:

En metod som deklareras med static är en klassmetod, och en variabel som deklareras med static är en klassvariabel. Klassmetoder kan bara läsa och skriva till klassvariabler, och kan bara anropa andra klassmetoder. Du kan tänka på det som att klassen i sig är ett objekt som har de variablerna och metoderna, och det objektet är annorlunda än de objekt som du kan skapa utifrån klassen. Ett "klassobjekt" skapas för varje klass som används i programmet.

Man kan använda klassmetoder och klassvariabler på lite olika sätt, men i många fall (som i ditt fall till exempel) så är det främst en optimering, att man säger till kompilatorn att den här metoden kommer inte att mutera (ändra på) objektet och då finns det optimeringar som den kan göra.

En annan fördel är som KurreKula säger att man inte behöver skapa något objekt för att anropa metoden.

Permalänk
Medlem

En sak som gjorde det svårare för mig när jag började programmera var att jag inte förstod om jag inte såg det i kod, så jag tänkte bara komplettera ovan talare med det.

public class Reverse { public int[] reverse(int[] arr){ int[] Arr = new int[arr.length]; int j=0; for(int i=(arr.length-1); i>=0; i--){ Arr[j] = arr[i]; j++; } return Arr; } }

Kräver med andra ord:

... int[] foo = new int[4]; Reverse r = new Reverse(); foo = r.reverse({1,2,3,4}); ...

Är metoden "static" räcker det med att anropa den på klassen.

... int[] foo = new int[4]; foo = Reverse.reverse({1,2,3,4}); ...

(eventuella kompileringsfel inkluderas i taxan)

Visa signatur

Love is a perky little elf dancing a merry little jig and then, suddenly, he turns on you with a miniature machine gun. -Matt Groening