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?
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
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 modificateurstatic
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.
Variable d'instance:
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:
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:
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.
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