web-dev-qa-db-fra.com

Variables d'objet et variables de classe en Java

Je suis en train d'apprendre Java et je ne comprends pas la différence entre les variables d'objet et la variable de classe. Tout ce que je sais, c'est que pour qu'il s'agisse d'une variable de classe, vous devez d'abord le déclarer avec l'instruction static. Merci!

11
foobar5512

En Java (et en OOP en général), les objets ont deux types de champs (variable). 

Les variables d'instance (ou variable d'objet) sont des champs qui appartiennent à une instance particulière d'un objet.

Les variables statiques (ou variable de classe) sont communes à toutes les instances de la même classe.

Voici un exemple:

public class Foobar{
    static int counter = 0 ; //static variable..all instances of Foobar will share the same counter and will change if such is done
    public int id; //instance variable. Each instance has its own id
    public Foobar(){
        this.id = counter++;
    }
}

usage:

Foobar obj1 = new Foobar();
Foobar obj2 = new Foobar();
System.out.println("obj1 id : " + obj1.id + " obj2.id "+ obj2.id + " id count " + Foobar.counter);
14
Heisenbug

La différence entre une variable statique ou une variable de classe et une variable d'instance ou une variable d'objet est assez simple. Chaque objet que vous créez a sa propre copie de ses propres variables d'instance. Où comme s'il y avait une variable statique dans la classe, une seule copie de cette variable statique existe pour tous les objets. Par exemple 

public class JellyBean{

    // instance variables every jellyBean object will have its own 
    // variable for color
    String color;

    // static variable only one copy of this variable exists for 
    // all jellyBean objects.
    static int totalNumberOfJellyBeans;

}//end class 

Si vous créez 2 objets Jellybean, vous aurez deux variables pour Color car chaque Jellybean a sa propre variable pour Color. Et 1 variable pour totalNumberOfJellyBeans car les deux objets jellyBean utilisent cette variable de classe.

3
gluestick

Supposons que vous avez un modèle de voiture appelé ToyotaYaris, dans lequel vous pourriez avoir une variable appelée maxSpeed. Toutes les voitures fabriquées avec ce plan (ses instances) auront la même vitesse maximale, de sorte que cette variable devrait appartenir au plan, et non aux voitures individuelles. Si la maxSpeed change dans le plan directeur, cela changera dans toutes les voitures produites.

Cependant, sur chaque voiture, vous voudrez peut-être avoir une autre variable appelée speed. Cette variable ne peut pas appartenir au modèle car chaque voiture peut rouler à des vitesses différentes indépendamment l'une de l'autre. Vous devez donc que cette variable appartienne à chaque instance spécifique de ToyotaYaris

Donc:

class ToyotaYaris {
    static int maxSpeed;
    int speed;
}
2
Smig

Une variable d'objet est un état dépendant d'une instance spécifique d'une classe, alors qu'une variable de classe est globalement accessible via la classe elle-même. Cela pourrait être un peu flou, alors voici quelques exemples:

class Muffin {

    private static final int calories = 9320;

    public String flavor;

    public Muffin( String flavor ){
        this.flavor = flavor;
    }

}

Dans cette classe, calories est une variable de classe. Dans n'importe quel autre morceau de code, vous pouvez obtenir le nombre de calories dans n'importe quel type de muffin en appelant Muffin.calories. Dans ce cas, le mot clé final est également utilisé pour rendre le nombre de calories constant.

Dans la même classe, nous avons une variable d'objet, flavor. Cela dépend de l'instance de la classe et est défini dans le constructeur.

Muffin myMuffin = new Muffin( "blueberry" );

Alors maintenant, vous pouvez accéder à la saveur de ce muffin spécifique en appelant myMuffin.flavor. Notez comment nous devons instancier un objet Muffin avant de pouvoir accéder à sa flavor.

Changer les variables statiques (de classe)

L'exemple ci-dessus est un peu exagéré, car différents types de muffins auraient différents comptes de calories. Ils sont utiles pour les constantes, mais voici un cas où la valeur de la variable statique change:

class Muffin {

    private static int next_id = 1;

    public int id;
    public String flavor;

    public Muffin( String flavor ){
        this.flavor = flavor;
        id = next_id++;
    }

}

Dans le deuxième exemple, nous avons besoin d'un numéro d'identification unique pour chaque muffin créé afin de pouvoir disposer d'une variable statique qui s'incrémente chaque fois qu'une Muffin est instanciée. Le mot clé static fait en sorte que la valeur de next_id persiste dans chaque appel au constructeur. Par conséquent, la variable id sera différente et continuera à augmenter pour chaque nouveau muffin.

2
derekerdmann

Une variable d'objet ou membre d'instance appartient à une instance spécifique d'une classe. C'est-à-dire que chaque instance a sa propre copie de cette donnée. Une variable de classe ou membre statique est partagée par toutes les instances de la classe. C'est-à-dire qu'il n'y a qu'une seule copie de cette donnée, peu importe le nombre d'instances de classe.

0
bobbymcr