2017-08-08 4 views
-2

J'ai besoin d'aide pour clarifier les variables statiques et non statiques. Je crois comprendre que les variables statiques ont la même valeur dans toutes les instances d'une classe. Cependant, supposons que j'ai un mélange de variables statiques et non-statiques dans la même classe. Lorsque je référence une variable statique, quelle que soit l'instance utilisée, j'obtiendrai la même valeur? Pourtant, quand je référence une variable non-statique, j'obtiendrai la valeur associée à cette classe particulière? Cela semble être un cauchemar de la gestion de la mémoire. Est-ce vraiment ainsi que cela fonctionne et comment la mémoire statique est-elle gérée? Des copies multiples de la variable sont-elles créées dans chaque instance et ensuite synchronisées ou est-ce qu'une référence par adresse est créée dans chaque instance? Y a-t-il des pièges qui utilisent un mélange de variables statiques et non-statiques dans la même classe? TIA.Variables statiques et non statiques Java dans la même classe

+1

'Quand je référence à une variable statique, quelle que soit l'instance est used' -> vous n'avez pas besoin (et ne doit pas) utiliser une instance pour obtenir la valeur de la variable statique. Vous devriez plutôt obtenir sa valeur avec cette syntaxe: 'YourClass.YOUR_STATIC_FINAL_VARIABLE' par exemple. Comme vous pouvez le voir, il n'y a pas besoin de 'newClass(). Quelque chose. –

+0

Merci, mais cette réponse n'est pas ce que je fais. J'utilise 'myclass1 = new MyClass(); myclass2 = nouveau MyClass(); '. Ensuite, je référence la variable statique en tant que «myclass1.something» ou «myclass2.something» et s'attendre à ce qu'ils aient la même valeur. Pendant ce temps, 'myclass1.somethingelse' et 'myclass2.somethingelse' auraient des valeurs différentes. C'est ce que j'essaie de vérifier et de savoir s'il y a des pièges à faire. –

Répondre

4

Vous avez raison dans votre assertion ... sorte-de. Les statistiques ne sont pas vraiment partagées entre les instances de la classe car vous n'avez pas besoin d'une instance de classe pour en référencer une.

public class Foo { 
    public static String MYSTRING = "test"; 
} 

peut être consulté sans une instance de Foo

String localString = Foo.MYSTRING; 

Je ne vous inquiétez pas vraiment beaucoup sur la façon dont la machine virtuelle Java choisit de stocker les références de mémoire pour les variables statiques, qui est un détail de mise en œuvre est délégué au concepteur JVM. Il n'y a aucun inconvénient à avoir une classe qui définit à la fois des variables statiques et non statiques (instance), cela arrive tout le temps et est parfaitement naturel ... tant que vous comprenez comment la statique fonctionne, qu'elle semble que vous faites.

+0

Merci. Je pensais que c'était le cas mais juste besoin de la chaleur et des fuzzies. –

2

Taken de OCA Java SE 7 Programmer I Certification Guide: Prepare for the 1ZO-803 exam:

STATIC VARIABLES

variables statiques appartiennent à une classe. Ils sont communs à toutes les instances d'une classe et ne sont propres à aucune instance d'une classe. Les attributs statiques existent indépendamment de toutes les instances d'une classe et peuvent être accédés même lorsqu'aucune instance de la classe n'a été créée. Vous pouvez comparer une variable statique à une variable partagée. Une variable statique est partagée par tous les objets d'une classe.

STATIC MÉTHODES

méthodes statiques ne sont pas associés à des objets et ne peuvent pas utiliser l'une des variables d'instance d'une classe. Vous pouvez définir des méthodes statiques pour accéder ou manipuler des variables statiques

Vous pouvez également utiliser des méthodes statiques pour définir les méthodes utilitaires, qui sont des méthodes qui manipulent habituellement les paramètres de la méthode pour calculer et retourner une valeur appropriée

Le non-privé les variables statiques et les méthodes sont héritées par les classes dérivées. Les membres statiques ne sont pas impliqués dans le polymorphisme d'exécution. Vous ne pouvez pas remplacer les membres statiques d'une classe dérivée, mais vous pouvez les redéfinir. Toute discussion sur les méthodes statiques et leur comportement peut être assez confuse si vous n'êtes pas conscient de l'héritage et des classes dérivées.

0

Static Les variables sont les mêmes dans tout le programme, car elles ne sont pas instanciées. C'est en effet le point d'avoir des variables statiques.Ils ne sont pas "en quelque sorte la même valeur", ils sont la même valeur car ils ne sont jamais instanciés et il n'y a jamais qu'une seule variable statique du même nom de la même classe pendant l'exécution.

0

Je ne sais pas la « logique de la mémoire » derrière, mais j'ai créé un exemple

public class TestClass { 

private static int a = 1; 
private int b = 1; 

public static void main(String[] args) { 
    TestClass firstInstance = new TestClass(); 
    TestClass secondInstance = new TestClass(); 

    // 'a' shouldn't be accessed like firstInstance.a, use TestClass.a instead(!) 
    System.out.println("firstInstance a: "+firstInstance.a+" b: "+firstInstance.b); // firstInstance a: 1 b: 1 
    System.out.println("secondInstance a: "+secondInstance.a+" b: "+secondInstance.b);// secondInstance a: 1 b: 1 

    firstInstance.a = 2; 
    firstInstance.b = 2; 

    System.out.println("firstInstance a: "+firstInstance.a+" b: "+firstInstance.b); //firstInstance a: 2 b: 2 
    System.out.println("secondInstance a: "+secondInstance.a+" b: "+secondInstance.b);//secondInstance a: 2 b: 1 
    //a is now 2 also for 'secondInstance' because it's static, secondInstance.b didn't change because b exists specifically for each instance 

    /* 
    * You can access 'a' even when no instance of TestClass exists 
    * think about a simple Dog class where the amount of legs is 4 for every dog, so you can make it static, 
    * but not every Dog has the same name, so it wouldn't be clever to make the name static 
    */ 
} 
}