Java Language
Använda det statiska nyckelordet
Sök…
Syntax
- statisk statisk int myVariable; // Förklara en statisk variabel
- public static myMethod () {} // Förklarar en statisk metod
- offentlig statisk slutlig dubbel MY_CONSTANT; // Förklara en konstant variabel som delas mellan alla instanser i klassen
- offentliga slutliga dubbel MY_CONSTANT; // Förklara en konstant variabel som är specifik för denna instans av klassen (bäst används i en konstruktör som genererar en annan konstant för varje instans)
Med statisk förklaring av konstanter
Eftersom det static
nyckelordet används för att få åtkomst till fält och metoder utan en instanserad klass, kan det användas för att förklara konstanter för användning i andra klasser. Dessa variabler kommer att förbli konstant över alla instanser av klassen. I ALL_CAPS
konventionen är static
variabler alltid ALL_CAPS
och använder understreck snarare än kamelfall. ex:
static E STATIC_VARIABLE_NAME
Eftersom konstanter inte kan ändras kan static
också användas med den final
modifieraren:
För att till exempel definiera den matematiska konstanten för pi:
public class MathUtilities {
static final double PI = 3.14159265358
}
Som kan användas i vilken klass som helst som en konstant, till exempel:
public class MathCalculations {
//Calculates the circumference of a circle
public double calculateCircumference(double radius) {
return (2 * radius * MathUtilities.PI);
}
}
Att använda statisk med detta
Statisk ger en metod eller variabel lagring som inte tilldelas för varje instans av klassen. Snarare delas den statiska variabeln mellan alla klassmedlemmar. Förresten, att försöka behandla den statiska variabeln som en medlem i klassinstansen kommer att resultera i en varning:
public class Apple {
public static int test;
public int test2;
}
Apple a = new Apple();
a.test = 1; // Warning
Apple.test = 1; // OK
Apple.test2 = 1; // Illegal: test2 is not static
a.test2 = 1; // OK
Metoder som förklaras statiska uppför sig på ungefär samma sätt, men med en ytterligare begränsning:
Du kan inte använda det
this
nyckelordet i dem!
public class Pineapple {
private static int numberOfSpikes;
private int age;
public static getNumberOfSpikes() {
return this.numberOfSpikes; // This doesn't compile
}
public static getNumberOfSpikes() {
return numberOfSpikes; // This compiles
}
}
I allmänhet är det bäst att förklara generiska metoder som gäller för olika instanser av en klass (som klonmetoder) static
, samtidigt som metoder som equals()
som icke-statiska. Den main
metoden för ett Java-program är alltid statisk, vilket innebär att sökordet this
inte kan användas inuti main()
.
Hänvisning till icke-statisk medlem från statisk sammanhang
Statiska variabler och metoder ingår inte i en instans. Det kommer alltid att finnas en enda kopia av den variabeln oavsett hur många objekt du skapar i en viss klass.
Till exempel kanske du vill ha en oföränderlig lista över konstanter, det skulle vara en bra idé att hålla den statisk och initiera den bara en gång i en statisk metod. Detta skulle ge dig en betydande prestationsförstärkning om du regelbundet skapar flera instanser av en viss klass.
Dessutom kan du också ha ett statiskt block i en klass. Du kan använda den för att tilldela ett standardvärde till en statisk variabel. De körs endast en gång när klassen laddas i minnet.
Instansvariabel som namnet antyder är beroende av en instans av ett visst objekt, de lever för att tjäna det nycklar. Du kan leka med dem under en viss livscykel för ett objekt.
Alla fält och metoder för en klass som används i en statisk metod i den klassen måste vara statiska eller lokala. Om du försöker använda instanser (icke-statiska) variabler eller metoder kommer din kod inte att sammanställas.
public class Week {
static int daysOfTheWeek = 7; // static variable
int dayOfTheWeek; // instance variable
public static int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this will cause errors
}
public int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this is valid
}
public static int getDaysLeftInTheWeek(int today){
return Week.daysOfTheWeek-today; // this is valid
}
}