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。(如果太难理解,简短的版本就是我上面的评论!)我明白了。谢谢:)更新了我的答案。