我在网上搜索了很长时间。但没用。请帮忙或尝试给出一些如何实现这一点的想法?为什么结果不打印第一个“int main”?我想知道的是为什么这个程序的结果如下?先谢谢。
超静态块
静态区块4
主中的
超级构造函数
构造
class StaticSuper {
static {
System.out.println("super static block");
}
StaticSuper() {
System.out.println("super constructor");
}
}
public class StaticTests extends StaticSuper {
static int rand;
//static initialise
static {
rand = (int) (Math.random() * 6);
System.out.println("static block " + rand);
}
StaticTests() {
System.out.println("constructor");
}
public static void main(String[] args) {
System.out.println("in main");
StaticTests st = new StaticTests();
}
}
答案 0 :(得分:1)
点火顺序为:
父构造函数
子非静态字段初始值设定项
您可以阅读有关here
的更多信息<强>更新强>
运行它,你就会明白为什么不应该在超类构造函数中调用非final方法。
public class Derived extends Super
{
@Override
void initialise()
{
System.out.println("Now you can't initialise field \"a\" anymore");
}
Derived()
{
}
public static void main(String[] args)
{
Derived d = new Derived();
}
}
class Super
{
private int a;
void initialise()
{
a = 10;
}
Super()
{
initialise();
}
}
因此,您无法初始化您的字段a
,这可能会破坏您的super
类代码。
final
方法无法覆盖。因此,您可以初始化字段a
,并且不会破坏super
类中的任何内容。
我希望它能澄清你的怀疑。
答案 1 :(得分:1)
序列如下:
您输入java StaticTests
JVM加载StaticTests
。
JVM找到static void main(String[])
方法并尝试调用它。
对main(...)
的调用会触发StaticTests
的静态初始化。 (在第一次调用静态方法之前初始化一个类。)
StaticTests
的静态初始化触发了StaticSuper
的静态初始化。 (必须在初始化类之前初始化类超类。)
“超静态块”由超静态初始化打印。
“static block 4”由子类static init。
main(...)
来电开始。
执行System.out.println("in main")
语句,在“主要”中打印。
new StaticTests
调用StaticTests
构造函数。
StaticTests
构造函数隐式调用super()
。 (正常的Java行为。)
超类构造函数打印“超级构造函数”。
子类构造函数打印“constructor”