Java Language
Utilisation du mot clé static
Recherche…
Syntaxe
- public static int myVariable; // Déclaration d'une variable statique
- public static myMethod () {} // Déclaration d'une méthode statique
- double final statique public MY_CONSTANT; // Déclaration d'une variable constante partagée par toutes les instances de la classe
- double final public MY_CONSTANT; // Déclaration d'une variable constante spécifique à cette instance de la classe (mieux utilisée dans un constructeur qui génère une constante différente pour chaque instance)
Utilisation de static pour déclarer des constantes
Comme le mot-clé static
est utilisé pour accéder aux champs et aux méthodes sans classe instanciée, il peut être utilisé pour déclarer des constantes à utiliser dans d'autres classes. Ces variables resteront constantes dans toutes les instanciations de la classe. Par convention, static
variables static
sont toujours ALL_CAPS
et utilisent des ALL_CAPS
soulignement plutôt que des cas camel. ex:
static E STATIC_VARIABLE_NAME
Comme les constantes ne peuvent pas changer, static
peut également être utilisé avec le modificateur final
:
Par exemple, pour définir la constante mathématique de pi:
public class MathUtilities {
static final double PI = 3.14159265358
}
Qui peut être utilisé dans n'importe quelle classe en tant que constante, par exemple:
public class MathCalculations {
//Calculates the circumference of a circle
public double calculateCircumference(double radius) {
return (2 * radius * MathUtilities.PI);
}
}
Utiliser statique avec cette
Statique fournit une méthode ou une variable de stockage qui n'est pas allouée pour chaque instance de la classe. La variable statique est plutôt partagée entre tous les membres de la classe. Incidemment, en essayant de traiter la variable statique comme un membre de l'instance de la classe, vous obtenez un avertissement:
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
Les méthodes déclarées statiques se comportent de la même manière, mais avec une restriction supplémentaire:
Vous ne pouvez pas utiliser
this
motthis
clé en eux!
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
}
}
En général, il est préférable de déclarer les méthodes génériques qui s'appliquent à différentes instances d'une classe (telles que les méthodes clones) static
, tout en conservant les méthodes telles que equals()
comme non statiques. La méthode main
d'un programme Java est toujours statique, ce qui signifie que le mot this
clé this
ne peut pas être utilisé dans main()
.
Référence à un membre non statique à partir d'un contexte statique
Les variables et méthodes statiques ne font pas partie d'une instance. Il y aura toujours une seule copie de cette variable, quel que soit le nombre d'objets que vous créez pour une classe particulière.
Par exemple, vous pourriez vouloir avoir une liste de constantes immuable, ce serait une bonne idée de la garder statique et de l'initialiser une seule fois dans une méthode statique. Cela vous donnerait un gain de performance significatif si vous créez régulièrement plusieurs instances d'une classe particulière.
De plus, vous pouvez également avoir un bloc statique dans une classe. Vous pouvez l'utiliser pour affecter une valeur par défaut à une variable statique. Ils ne sont exécutés qu'une fois lorsque la classe est chargée en mémoire.
Les variables d'instance, comme le nom l'indique, dépendent d'une instance d'un objet particulier, et vivent pour en satisfaire les caprices. Vous pouvez jouer avec eux pendant un cycle de vie particulier d'un objet.
Tous les champs et méthodes d'une classe utilisée dans une méthode statique de cette classe doivent être statiques ou locaux. Si vous essayez d'utiliser des variables ou des méthodes d'instance (non statiques), votre code ne sera pas compilé.
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
}
}