Quelles sont les règles qui dictent l'héritage de la statique des variables en Java?

J'ai une classe, Super:

public class Super {
    public static String foo = "foo";
}

J'ai aussi une autre classe, Sub qui s'étend Super:

public class Sub extends Super {
    static {
        foo = "bar";
    }

    public static void main (String[] args) {
        System.out.println(Super.foo);
    }
}

Quand je le lance, il imprime bar.

Mon troisième (et dernier) de la classe est Testing:

public class Testing {
    public static void main (String[] args) {
        System.out.println(Super.foo);
        System.out.println(Sub.foo);
        System.out.println(Super.foo);
    }
}

Cette affiche:

foo
foo
foo

Je ne comprends pas pourquoi le contenu de foo varier en fonction de la catégorie à laquelle vous accédez à partir de. Quelqu'un peut-il m'expliquer?

  • Ce que je voulais dire par cette déclaration a été que quand j'y accéder à partir de Testing il renvoie à quelque chose de différent que quand j'y accéder à partir de Sub.
  • @jmgrosen: Ah, maintenant avec vous.
  • FWIW, note la distinction importante entre ce que vous avez ci-dessus et ce que vous auriez si Sub contenues public static String foo = "bar"; (après quoi, vous obtenez "foo", "bar", "toto" comme vous l'avez sans doute s'attendre).
  • Je ne suis pas sûr si le comportement de ce code est un argument contre le fait d'avoir des variables statiques qui ne sont ni privés ni définitif, ou à l'encontre de laisser les initialiseurs statiques (même implicitement) mess avec d'autres classes de variables statiques. Sans doute les deux.
InformationsquelleAutor jmgrosen | 2012-03-27