web-dev-qa-db-fra.com

Quelles sont les différences entre les variables de classe et les variables d'instance en Java?

Je suis très nouveau à Java et je veux comprendre la différence entre les variables de classe et les variables d'instance.

Par exemple:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

En quoi les variables d'instance et les variables de classe sont-elles différentes les unes des autres? Quelles variables ici sont des variables de classe et quelles sont les variables d'instance? Comment cela affecte-t-il la portée?

16
Skylar Adams

Ils sont tous les deux variables membres , ce qui signifie que les deux sont associés à une classe. Maintenant, bien sûr, il y a des différences entre les deux:

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 appelées 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:

// INSTANCE VARIABLE
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:

//CLASS VARIABLE
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

35
Abbas

Il est expliqué ici (avec un exemple de classe Bicycle avec la variable de classe numberOfBicycles et les variables d'instance cadence, speed, gear & id):

Parfois, vous souhaitez avoir des variables communes à tous les objets. Ceci est accompli avec le modificateur static. Les champs qui ont le modificateur static dans leur déclaration sont appelés champs statiques ou variables de classe. Ils sont associés à la classe plutôt qu'à n'importe quel objet. Chaque instance de la classe partage une variable de classe, qui se trouve dans un emplacement fixe en mémoire. Tout objet peut modifier la valeur d'une variable de classe, mais les variables de classe peuvent également être manipulées sans créer d'instance de la classe.

Une variable de classe (déclarée static) est un emplacement commun à toutes les instances.

Dans l'exemple, numberOfBicycles est une variable de classe (car elle est déclarée static). Il n'y a qu'une seule variable (c'est-à-dire l'emplacement) commune à toutes les instances et à la classe. Donc, si vous modifiez numberOfBicycles dans une méthode, d'autres méthodes verront la nouvelle valeur (même pour différents objets Bicycle)

En revanche, gear & id sont des variables d'instance (car leur déclaration n'a pas de modificateur static) . Chaque objet Bicycle en possède un. Si vous modifiez gear pour certains Bicycle a , et si b est une autre instance, modifiant a.gear n'a aucun effet sur b.gear

Chaque objet Java est une zone de mémoire distincte avec des métadonnées (par exemple, une référence à sa classe) et ses propres variables d'instance (peut-être héritées d'une superclasse). Mais les variables de classe sont communes aux et partagée par toutes les instances.

Voir aussi Objet (informatique) & Variable d'instance wikipages.

6

Variable d'instance:

  • Les variables d'instance sont déclarées dans une classe, mais en dehors d'une méthode, d'un constructeur ou de tout bloc.
  • La variable d'instance appartient à l'instance d'une classe ou vous pouvez dire que la variable d'instance appartient à l'objet.
  • La variable d'instance a une valeur distincte pour chaque instance de la classe.

    Class InstanceDemo {
    
         // this instance variable is visible for any child class.
           public String name = "Testing";
    
         // count variable is visible in Demo class only.
           private int count = 2;
    }
    

Méthode pour accéder à la variable d'instance:

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

Sortie: 2, test

Variable de classe:

  • La variable de classe appartient à la classe.
  • la variable de classe est créée en ajoutant un mot clé "statique" avant la variable.
  • Aussi appelée variable statique.
  • Et la variable de classe la plus importante conserve une valeur partagée unique pour toutes les instances d'une classe, même si aucun objet instance de la classe n'existe.

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }
    

Méthode pour accéder à la variable de classe:

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

Sortie: 2

Brève différence entre la variable de classe et la variable d'instance:

  • Les variables d'instance ont des valeurs distinctes pour chaque instance d'une classe. Les variables de classe conservent une valeur partagée unique pour toutes les instances de la classe, même si aucun objet d'instance de cette classe n'existe.
  • Vous utiliseriez le mot-clé statique pour changer une variable d'instance en une variable de classe.
  • Les variables d'instance et de classe sont déclarées au niveau de la classe, pas dans les méthodes.
4
Garg's

La différence entre class variables et instance variables, est simplement une question de who knows what?.

Une instance variable est uniquement connu (= lié ) à cette instance concrète - d'où le nom.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

La définition d'une classe est comme un blueprint pour construire des objets concret. Peut-être que ce point confond vous un peu. Mais en l'écrivant de cette façon, chaque variable serait liée à son objet concret: par ex. Chaque personne a son propre prénom

UNE class variable d'autre part - comme son nom l'indique - connu de chaque membre d'une classe; ou techniquement: Il est connu/lié à niveau de classe. L'exemple typique est un compteur du nombre d'objets que vous avez créés - bien que ce soit un exemple très problématique; mais cela n'a pas d'importance à ce stade précoce.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersons est déclaré static qui est le mot clé pour distinguer entre class variables et instance variabes. La variable est déclarée comme les autres dans la définition de classe. Mais le mot clé static indique qu'il est différent.

  • firstName, lastName sont variables d'instance et liés à cette instance concrète

  • numberOfPersons est lié à la classe, afin que chaque instance puisse accéder à cette variable.

tl; dr

L'endroit où les variables sont définies est la définition de classe.

Les variables de classe sont connues au niveau de la classe/liées, c'est-à-dire que chaque instance concrète y a accès. Pour définir une variable de classe, vous utilisez le mot clé static.

Les variables d'instance ne sont connues qu'au niveau d'une instance. Vous les définissez sans le mot clé static.

Documentation supplémentaire pour Java is here

3
Thomas Junk