web-dev-qa-db-fra.com

Variables statiques vs instance: différence?

Quelle est la différence entre une variable statique et une variable d'instance. La phrase suivante est ce que je ne peux pas obtenir:

Dans certains cas, une seule copie d'une variable particulière doit être partagée par tous les objets d'une classe - ici une variable statique est utilisée.
Une variable statique représente des informations à l'échelle de la classe. Tous les objets d'une classe partagent les mêmes données.

Je pensais que les variables d'instance étaient utilisées à l'échelle de la classe alors que les variables statiques n'avaient de portée que dans leurs propres méthodes?

19
user2971033

Dans le contexte des attributs de classe, static a une signification différente. Si vous avez un champ comme:

private static int sharedAttribute;

alors, chaque instance de la classe partagera la même variable, de sorte que si vous la modifiez dans une instance, la modification se reflétera dans toutes les instances, créées soit avant ou après le changement.

Ainsi dit, vous pourriez comprendre que cela est mauvais dans de nombreux cas, car cela peut facilement se transformer en un effet secondaire indésirable: la modification de l'objet a affecte également b et vous pourriez vous demander pourquoi b a changé sans raison apparente. Quoi qu'il en soit, il existe des cas où ce comportement est absolument souhaitable:

  1. constantes de classe: puisqu'elles sont const, avoir toutes les classes accédant à la même valeur ne fera aucun mal, car personne ne peut changer cela. Ils peuvent également économiser de la mémoire, si vous avez beaucoup d'instances de cette classe. Je ne suis pas sûr de l'accès simultané , cependant.
  2. les variables qui sont destinées à être partagées, telles que les compteurs de référence & co.

static les variables sont instanciées avant le démarrage de votre programme, donc si vous en avez trop, vous pourriez ralentir le démarrage.

Une méthode static ne peut accéder qu'aux attributs static, mais réfléchissez bien avant d'essayer.

Règle générale: n'utilisez pas static, sauf si cela est nécessaire et que vous savez ce que vous faites ou si vous déclarez une constante de classe.

25
Stefano Sanfilippo

Disons qu'il y a une classe de test:

class Test{
public static int a = 5;
public int b = 10;
}
// here t1 and t2 will have a separate copy of b
// while they will have same copy of a.
Test t1 = new test(); 
Test t2 = new test();

Vous pouvez accéder à une variable statique avec son nom de classe comme celui-ci

Test.a = 1//some value But you can not access instance variable like this
System.out.println(t1.a);
System.out.println(t2.a);

Dans les deux cas, la sortie sera 1 car elle est partagée par toutes les instances de la classe de test. tandis que la variable d'instance aura chacun une copie distincte de b (variable d'instance) Donc

 t1.b = 15 // will not be reflected in t2.
 System.out.println(t1.b); // this will print 15
 System.out.println(t2.b); / this will still print 10; 

J'espère que cela explique votre requête.

11
user2754122

Variables d'instance:

Ces variables appartiennent à l'instance d'une classe, donc d'un objet. Et chaque instance de cette classe (objet) a sa propre copie de cette variable. Les modifications apportées à la variable ne se reflètent pas dans les autres instances de cette classe.

public class Product {
    public int barcode;
}

Variables de classe:

Celles-ci sont également connues sous le nom de variables membres statiques et il n'y a qu'une seule copie de cette variable qui est partagée avec toutes les instances de cette classe. Si des modifications sont apportées à cette variable, toutes les autres instances verront l'effet des modifications.

public class Product {
    public static int barcode;
}

Exemple complet:

Variables d'instance:

public class Main {
    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.barcode = 123456;

        Product prod2 = new Product();
        prod2.barcode = 987654;

        System.out.println(prod1.barcode);
        System.out.println(prod2.barcode);
    }
}

public class Product {
    public int barcode;
}

La sortie sera:

123456
987654

Maintenant, changez la variable d'instance en variable de classe en la rendant statique:

Variables de classe:

public class Main {
    public static void main(String[] args) {

        Product prod1 = new Product();
        prod1.setBarcode(123456);
        Product prod2 = new Product();
        prod2.setBarcode(987654);

        System.out.println(prod1.getBarcode());
        System.out.println(prod2.getBarcode());
    }
}

public class Product {
    public static int barcode;

    public int getBarcode() {
        return barcode;
    }

    public void setBarcode(int value){
        barcode = value;
    }
}

J'ai utilisé des méthodes non statiques pour obtenir et définir la valeur de Barcode pour pouvoir l'appeler depuis l'objet et non depuis la classe.
La sortie sera la suivante:

987654
987654

9
Suchi Gupta

Les variables de classe n'ont qu'une seule copie partagée par tous les différents objets d'une classe, tandis que chaque objet a sa propre copie personnelle d'une variable d'instance. Ainsi, les variables d'instance entre différents objets peuvent avoir des valeurs différentes tandis que les variables de classe entre différents objets ne peuvent avoir qu'une seule valeur.

4
jeswin

Les variables statiques (classe) et les variables d'instance sont toutes deux des variables membres car elles sont toutes deux associées à une classe spécifique, mais la différence entre elles est que les variables de classe n'ont qu'une seule copie qui est partagée par tous les différents objets d'une classe, alors que chaque objet a c'est sa propre copie personnelle d'une variable d'instance. Ainsi, les variables d'instance sur différents objets peuvent avoir des valeurs différentes tandis que les variables de classe sur différents objets ne peuvent avoir qu'une seule valeur.

1
Venkat Bramhaiah

Les variables d'instance contiennent des valeurs qui doivent être référencées par plusieurs méthodes, constructeurs ou blocs, ou des parties essentielles de l'état d'un objet qui doivent être présentes dans toute la classe. La variable statique ne serait qu'une copie de chaque variable de classe par classe, quel que soit le nombre d'objets créés à partir d'elle.

1
Yel

Supposons que nous créons une variable statique K et dans la fonction principale, nous créons trois objets: ob1 ob2 ob3; Tous ces objets peuvent avoir la même valeur pour la variable K. En revanche, si la variable K était une variable d'instance, elle pourrait avoir des valeurs différentes comme: ob1.k ob2.k ob3.k

1
sachin

Je pense que vous pensez à la définition C/C++ du mot-clé statique. Là, le mot-clé statique a de nombreuses utilisations. En Java, la fonctionnalité du mot clé statique est décrite dans votre message. Quoi qu'il en soit, vous pouvez l'essayer par vous-même:

public class Test_Static{
    static int x;
    public static void main(String[] argv){
        Test_Static a = new Test_Static();
        Test_Static b = new Test_Static();
        a.x = 1; // This will give an error, but still compile.
        b.x = 2;
        System.out.println(a.x); // Should print 2
    }
}

et de même pour les variables non statiques:

public class Test_NonStatic{
     int x;
     public static void main(String [] argv){
         Test_NonStatic a = new Test_NonStatic();
         Test_NonStatic b = new Test_NonStatic();
         a.x = 1;
         b.x = 2;
         System.out.println(a.x); // Should print 1.
     }
}
0
avak

Considérons une classe MyClass, ayant un membre statique et un membre non statique:

public class MyClass {
    public static int STATICVARIABLE = 0;
    public int nonStaticVariable = 0;
}

Maintenant, créons une main() pour créer quelques instances:

public class AnotherClass{  
    public static void main(String[] args) {    
        // Create two instances of MyClass
        MyClass obj1  = new MyClass();
        MyClass obj2  = new MyClass();
        obj1.nonStaticVariable = 30;  // Setting value for nonstatic varibale
        obj1.STATICVARIABLE = 40; //Setting value for static variable       
        obj2.nonStaticVariable = 50;
        obj2.STATICVARIABLE = 60;

        // Print the values actually set for static and non-static variables.
        System.out.println(obj1.STATICVARIABLE);
        System.out.println(obj1.nonStaticVariable);
        System.out.println(obj2.STATICVARIABLE);
        System.out.println(obj2.nonStaticVariable);
    }
}

Résultat:

60
30
60
50

Vous pouvez maintenant voir la valeur de la variable statique imprimée 60 À la fois, car obj1 Et obj2 Faisaient référence à la même variable. Avec la variable non statique, les sorties diffèrent, car chaque objet lors de sa création conserve sa propre copie de la variable non statique; les modifications qui leur sont apportées n'ont pas d'impact sur l'autre copie de la variable créée par un autre objet.

0
user3729220