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

Java 访问静态成员的子类化规则是什么?,java,static,subclass,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) {

我在和静态成员鬼混,当编译了一些我认为不应该编译的东西时,我感到困惑:

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上的静态成员。我的理解是,静态信息保存在它声明的类中,而不是传递到子类中。这是一个错误的假设,还是编译器做了一些鬼鬼祟祟的事情?

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


如果您将它设置为私有的,您将无法访问它。

在类B中,您实际上在类A上设置了s,而不是它的实例。构造函数中的行与

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

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

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

请参阅JLS关于访问控制的说明:

一个有用的链接是。它有一个很好的小表格,显示了它们之间的关系。