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
    }
    
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow