我在和静态成员一起搞砸了,当我编译的东西没有想到时,我感到很困惑:
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上的静态成员。我的理解是静态信息与它声明的类保持一致,并且不会传递给子类。这是一个不正确的假设,还是编译器做鬼鬼祟祟的事情?
答案 0 :(得分:4)
未指定访问修饰符会使成员可用于整个package
。静态是类范围的,但这并不意味着你无法从外部访问它们。
如果您使用private
,则无法访问它。
答案 1 :(得分:3)
静态信息绝对不会保存在声明它的类中。标准访问控制规则适用于为类定义的每个静态成员。这意味着您可以将private
,protected
,package 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”,因为您可以从派生类访问它。