Java 静态初始值设定项如何影响这一点?

Java 静态初始值设定项如何影响这一点?,java,class,inheritance,Java,Class,Inheritance,有人能解释一下这段代码吗?另外,静态是如何影响这一点的? 抱歉,可能存在错误 class A { static { System.out.println("THIRD"); } } class B extends A { static { System.out.println("SECOND"); } } class C extends B { static { System.out.printl

有人能解释一下这段代码吗?另外,静态是如何影响这一点的? 抱歉,可能存在错误

class A
{   static
    {
        System.out.println("THIRD");
    }
}
class B extends A
{   static
    {
        System.out.println("SECOND");
    }
}
class C extends B
{   static
    {
        System.out.println("FIRST");
    }
}
public class MainClass
{   public static void main(String[] args)
    {
        C c = new C();
    }
}

由于超类在子类之前初始化,所以当您创建C类的对象时,JVM在C类之前在内部初始化B类,因为C类扩展了B类

同样,由于B类扩展了一个类,所以当初始化B类时,JVM会在加载B类之前在内部初始化一个类

这意味着,在此场景中,JVM将按照以下顺序初始化主存中的类:

A类-->B类-->C类

因为静态块是在第一次主动使用类时执行的。 首先执行一个类静态块,然后执行B类静态块,最后执行C类静态块

输出:

THIRD
SECOND
FIRST

哦,我的错!很抱歉我会修好的,这是不对的。事实上,类(以及静态初始值设定项)是按照它们第一次使用的顺序初始化的。这与类加载顺序不同。有关更多详细信息,请参见dup链接问题的答案,包括指向Java语言规范相关部分的链接等。我认为,当类首次加载到主内存中时,只执行静态初始值设定项。类仅在第一次使用时加载。如果我错了,请纠正我。我正在纠正你。阅读JLS和。慢慢来,这本书不容易读。。。如果您以前从未阅读过JLS。(如果太难理解,简短的版本就是我上面的评论!)我明白了。谢谢:)更新了我的答案。