子类化访问静态成员的规则是什么?

时间:2011-12-21 12:03:08

标签: java static subclass

我在和静态成员一起搞砸了,当我编译的东西没有想到时,我感到很困惑:

class ClassA {
    static String s = " ";
}

public class ClassB extends ClassA {
    private ClassB() { 
         s = "I feel like this shouldn't be possible."; 
    }
    public static void main (String[] args) {
        new ClassB();
        System.out.println(s);
    }
}

我不明白ClassB如何访问ClassA上的静态成员。我的理解是静态信息与它声明的类保持一致,并且不会传递给子类。这是一个不正确的假设,还是编译器做鬼鬼祟祟的事情?

3 个答案:

答案 0 :(得分:4)

未指定访问修饰符会使成员可用于整个package。静态是类范围的,但这并不意味着你无法从外部访问它们。

如果您使用private,则无法访问它。

答案 1 :(得分:3)

静态信息绝对不会保存在声明它的类中。标准访问控制规则适用于为类定义的每个静态成员。这意味着您可以将privateprotectedpackage protected(您的案例)和public访问控制修饰符应用于类的所有静态成员(包括方法)。

了解JLS对访问控制的看法:http://java.sun.com/docs/books/jls/third_edition/html/names.html#104285

答案 2 :(得分:0)

在B类中,你实际上是在ClassA上设置的,而不是它的实例。构造函数中的行与

等效
private ClassB() { 
         ClassA.s = "I feel like this shouldn't be possible."; 
    }

但是,您可以省略“ClassA”,因为您可以从派生类访问它。