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

16

Je suis très nouveau en 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?

Skylar Adams
la source
1
Vous semblez avoir commencé à lire The Java ™ Tutorials: Understanding Class Members qui explique cela, mais vous ne l'avez pas entièrement compris.

Réponses:

35

Ils sont tous deux des 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 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:

// 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 Barcodepour pouvoir l'appeler depuis l'objet et non depuis la classe. La sortie sera la suivante:

987654

987654

Abbas
la source
Pourquoi un exemple C # pour une question Java?
Basile Starynkevitch
Mes pensées exactement.Je ne connais que la programmation java pas C #, donc vous n'avez pas été d'une grande aide
Skylar Adams
1
@BasileStarynkevitch Je suis principalement un développeur C # et puisque le principe compte pour les deux et est aussi bon que le même, j'ai rapidement fourni un exemple C #, mal de moi bien sûr. :) Changé mon exemple en Java.
Abbas
2
@SkylarAdams Désolé, j'ai supposé à tort trop rapidement que quiconque connaissant Java connaît C #. J'ai changé l'exemple en Java, j'espère que cela aide.
Abbas
9
Pour ce genre de question, je pense que ce n'est pas pertinent, que ce soit en utilisant Java ou C #,
Thomas Junk
6

Il est expliqué ici (avec un exemple de Bicycleclasse avec variables de classe des numberOfBicyclesvariables et d' instance cadence, speed, gear& id):

Parfois, vous souhaitez avoir des variables communes à tous les objets. Ceci est accompli avec le staticmodificateur. Les champs qui ont le staticmodificateur 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, numberOfBicyclesest 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 numberOfBicyclesune méthode, d'autres méthodes verront la nouvelle valeur (même pour différents Bicycleobjets)

En revanche, gear& idsont des variables d' instance (car leur déclaration n'a pas de staticmodificateur). Chaque Bicycleobjet en possède un. Si vous modifiez gearpour certains Bicycle a , et si b est une autre instance, la modification a.gearn'a aucun effet surb.gear

Chaque objet Java est une zone de mémoire distincte avec quelques 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 à la classe et partagées par toutes les instances.

Voir aussi les wikipages d' objets (informatique) et de variables d'instance .

Basile Starynkevitch
la source
4

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 d'accès à 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 d'accès à 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.
Garg's
la source
3

La différence entre class variableset instancevariables, est simplement une question de who knows what?.

Un instance variableest 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 modèle de construction d' objets en béton . Peut-être que ce point vous déroute un peu. Mais en l'écrivant de cette façon, chaque variable serait liée à son objet concret: par exemple, chaque personne a son propre prénom

A class variable, d'autre part - comme son nom l'indique - connu de chaque membre d'une classe; ou techniquement: il est connu / lié au niveau de la 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
  }

numberOfPersonsest déclaré, staticqui est le mot clé pour distinguer entre class variableset instance variabes. La variable est déclarée comme les autres dans la définition de classe. Mais le staticmot - clé signale qu'il est différent.

  • firstName, lastNamesont des variables d'instance et liées à 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 staticmot clé.

La documentation supplémentaire pour Java est ici

Thomas Junk
la source