为什么我的静态块允许在不使用 parentclass 引用的情况下调用 parent class 静态方法?

Why does my static block allows to call parent class static method without using parentclass reference?

据我了解,通常应该使用class的引用来调用静态方法,或者如果它在静态方法或静态块中,则可以直接调用而无需引用。

但这是否适用于从 child class 静态块调用静态方法时?

为什么它允许这样的事情,因为静态方法不是继承的,它应该只允许使用 parent class 名称对吗?

public abstract class abs {

    /**
     * @param args
     */
    abstract void m();
    static void n(){
        System.out.println("satic method");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}
class myclass extends abs{

    @Override
    void m() {
        // TODO Auto-generated method stub

    }
    static{
        n();
    }
}

为什么我的 child class 静态块可以在没有引用或 class 名称的情况下调用 parent class 静态方法?

静态方法n()被子类myclass继承,所以可以在myclass.

的静态块中直接调用

因为您继承了父 class,您可以直接访问该 class 的所有非私有成员,就好像它属于子 class。

Usually the static method should be called using class's reference or it can be called directly without reference if its in a static method or static block.

不是真的。例如,一个实例方法可以调用一个静态方法而无需前缀 class。

更一般地说,static 成员(字段作为方法)必须通过在它们的 class 前面加上前缀来调用,因为编译器无法推断出它们所属的 class。
当您从子 class 调用父 class 中定义的静态方法时(静态方法在子 class 中继承),您不需要在 class 作为编译器推断的方法调用。

超类的所有成员都被子类继承,其中也包括静态方法。

    class SuperClassA {

    static void superclassmethod() {
        System.out.println("superclassmethod in Superclass ");
    }
}

public class SubClassA extends SuperClassA {
    static {
        superclassmethod();
    }

    public static void main(String[] args) {

    }
}

但是当超类的静态方法被覆盖时,它隐藏了超类的静态方法而不是覆盖它。

Why it allows such thing

通过继承。

as static methods are not inherited

你一直这么说。你错了。来自 JLS #8.4.8:

A class C inherits from its direct superclass all concrete methods m (both static and instance) of the superclass for which all of the following are true: ...

继续阅读here