class abc extends TestStart{
static{
System.out.println("c");
}
{
System.out.println("f");
}
public abc(){
System.out.println("d");
}
}
public class TestStart {
static {
System.out.println("A");
}
{
System.out.println("z");
}
public TestStart(){
System.out.println("b");
}
public static void main(String[] args) {
TestStart x = new abc();
TestStart y = new TestStart();
}
}
输出-----------> 一个 C ž b F d ž B'/ P>
我认为这个的输出行为---->>>>> TestStart x = new abc(); --------应该是: -
我应该得到以下输出: 一个 C F ž b d ž B'/ P>
这种行为主要来源于父类和子类中没有init块。 请解释我提到的输出。
答案 0 :(得分:2)
您得到:A
c
z
b
f
d
z
b
A
c
f
z
b
d
z
b
所以,你是说你期望在f
z
之前发生b
。
所以,你基本上说的是你所期望的:
f
)
z
)和b
)。 嗯,这根本不是事情的发生。必须在派生类的实例初始化开始之前完成基类的所有实例初始化,否则派生类将能够访问基类的未初始化成员。
所有静态初始化内容(A
,c
)都是问题中的红色鲱鱼,让我们感到困惑。
答案 1 :(得分:0)
初始化之后,所有类中的静态块和变量都运行父级的初始化程序。在父构造函数之后,然后在子构造函数中初始化子项。 那是因为您可以在子初始值设定项中使用一些父字段,因此必须先将它们初始化。
答案 2 :(得分:0)
首先,一些命名:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li>WHITBY
<time datetime="2015-11-1">November 1st 11.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>EASINGWOLD
<time datetime="2015-11-2">November 2nd 10.34</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>DARLINGTON
<time datetime="2015-11-15">November 15th 9.30</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>RIPON CITY
<time datetime="2015-11-16">November 16th 11.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>ROMANBY
<time datetime="2015-11-20">November 20th 13.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>KIRKBYMOORSIDE
<time datetime="2015-11-21">November 21st</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>BEDALE
<time datetime="2015-11-22">November 22nd 8.30</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
<li>CATTERICK
<time datetime="2015-11-23">November 23rd 9.00</time><a href="bbc.co.uk" class="datelink"> SOME LINK </a>
</li>
</ul>
首先调用静态初始化器是正确的,但唯一的保证是在任何上下文中使用该类之前调用类静态初始化器。
对于实例初始化器和构造器,调用的顺序如下,从第一次调用到最后调用:
public class TestStart {
static { // static initializer
System.out.println("A");
}
{ // instance initializer
System.out.println("z");
}
public TestStart() { // constructor
System.out.println("b");
}
}
如果使用Parent initializer, Parent Constructor, Your Initializer, Your Constructor
从同一个类调用其他构造函数,则在所有构造函数调用类之前调用初始化程序。