Je me demande comment une méthode non statique peut modifier une variable d'instance statique. Je sais que les méthodes statiques ne peuvent accéder qu’à d’autres méthodes statiques et à des variables statiques. Cependant, l'autre côté est-il vrai? Les méthodes non statiques peuvent-elles accéder uniquement aux variables non statiques? Par exemple:
public class SampleClass {
private static int currentCount = 0;
public SampleClass() {
currentCount++;
}
public void increaseCount() {
currentCount++;
}
}
Ce code est compilé et j'aimerais savoir pourquoi en termes de privilèges d'accès statique.
J'ai trouvé cela de Les tutoriels Java
Donc, la réponse est oui, les méthodes non statiques PEUVENT modifier les variables statiques
Non, toute méthode non statique a accès aux membres statiques. La seule façon que cela soit faux est si le contexte non statique n'a pas accès au membre statique (par exemple, le membre statique est privé d'une classe et le code non statique n'est pas dans cette classe). Des variables statiques existent pour fournir une variable/méthode sans instance. Ainsi, par exemple, si nous avons une classe Game et une variable highscore, le highscore serait statique (accessible sans instance), et après chaque jeu (une instance de la classe Game) complète, nous pourrions modifier les meilleurs scores de notre contexte non statique si notre score est supérieur au score élevé.
Les méthodes non statiques peuvent accéder aux variables statiques . Les méthodes statiques peuvent uniquement accéder directement aux variables statiques ou aux méthodes sans créer object.ex: public static void main (String arg [])
Les membres statiques ne sont pas des membres d'instance, ils sont partagés par classe. Ainsi, toute méthode d'instance peut accéder à ces membres statiques.
Oui, une méthode statique peut accéder à une variable non statique. Ceci est fait en créant un objet dans la classe et en accédant à la variable via l'objet. Dans l'exemple ci-dessous, main
est une méthode statique qui accède à la variable a
qui est une variable non statique.
code de démonstration:
public class Sample {
private int a;
void method()
{
System.out.println("i am a private method");
}
public static void main(String[] args)
{
Sample sample=new Sample();
sample.a=10;
System.out.println(sample.a);
}
}
Les méthodes non statiques peuvent accéder aux variables statiques et aux méthodes statiques en tant que membres de la classe
public class Static_Class {
protected static String str;
private static int runningLoop;
static{
str = "Static Block";
}
/**
* Non-Static Method Accessing Static Member
*/
public void modifyStaticMember(){
str = "Non-Static Method";
}
/**
* Non-Static Method invoking Static Method
*/
public void invokeStaticMethod(){
String[] args = {};
if(runningLoop == 0){
runningLoop++;
main(args);
}
//Exiting as it will lead to Java.lang.StackOverflowError
System.exit(0);
}
public static void main(String[] args) {
Static_Class instance = new Static_Class();
System.out.println(str);
instance.modifyStaticMember();
// Changed Value persists
System.out.println(str);
//Invoking Static Method
instance.invokeStaticMethod();
}
}
Vois-le de cette façon. Une variable statique est accessible de plusieurs manières. L'une des plus courantes consiste à faire précéder le nom de la variable par le nom de la classe, car les variables statiques sont calculées par classe. Puisque vous vous référez à cette variable dans la même classe, vous êtes dispensé de obligé de le faire précéder du nom de la classe. Peu importe où vous appelez la variable statique. Il s’agit également d’une variable statique privée qui n’est accessible à aucune autre classe.
Les variables statiques sont des variables de classe et non d'instance ou de variable locale. c'est pourquoi nous pouvons également utiliser une variable statique dans une méthode non statique. et les variables statiques ne sont pas par objet. les variables statiques ont une copie qui sera utilisée dans tout le programme.
Les méthodes statiques ne peuvent pas modifier les champs non statiques car - Pour utiliser un champ non statique (en dehors de la classe), vous devez instancier un objet de classe, Mais pour utiliser une méthode statique, il n'y a aucun besoin d'instanciation d'objet ..__ C'est pourquoi il n'est pas raisonnable pour une méthode non statique (qui n'exige pas une instanciation d'objet) De modifier un champ devant être instancié.
Pour cela - Les méthodes statiques ne peuvent toucher que des champs statiques (ou appeler d'autres méthodes statiques).
Mais comme vous l'avez dit, l'inverse est possible, Une méthode non statique peut modifier un champ statique qui est statique pour tous les objets de sa classe.