Nat*_*anC 8 java initialization
我了解到初始化顺序的原则是:
但我仍然对此代码的输出感到困惑:
public class Test1 {
static {
add(2);
}
static void add (int num) {
System.out.println(num + " ");
}
public Test1() {
add(5);
System.out.println("Constructor!");
}
static {
add(4);
}
{
add(6);
}
static {
new Test1();
}
{
add(8);
}
public static void main(String[] args) {
System.out.println("Main method!");
add(10);
}
{
add(11);
}
static {
add(12);
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
2
4
6
8
11
5
Constructor!
12
Main method!
10
Run Code Online (Sandbox Code Playgroud)
如果没有add(10)的陈述; 加(11); 加(12); 我完全可以理解.你能解释一下这三个陈述的初始化顺序吗?
静态初始化程序是第一个,所以你得到
2
4
Run Code Online (Sandbox Code Playgroud)
但是在下一个静态初始化程序中,您调用Test1.class的新实例,因此触发实例初始化程序,在它们之后触发构造函数,然后得到:
6
8
11
5
Constructor!
Run Code Online (Sandbox Code Playgroud)
之后调用其余的静态初始化程序.所以:
12
Run Code Online (Sandbox Code Playgroud)
最后一个是主要方法:
Main method!
10
Run Code Online (Sandbox Code Playgroud)
小智 7
1)没有如下名称的块称为" 实例初始化器 ",只有在创建新对象时才会调用它,如DefaultConstructor或noArg构造函数.
{
add(11);
}
Run Code Online (Sandbox Code Playgroud)
2)在上面的代码中,你有静态块(在类加载本身首先被调用),实例初始化器(在创建对象时调用),显式DefaultConstructor(在创建对象时调用,但记住始终优先实例初始化器))和最后的主要方法.
3)现在让我们分析你的代码,
第一个电话:
static
{
add(2); //print 2
}
Run Code Online (Sandbox Code Playgroud)
第二个电话:
static {
add(4); // print 4
}
Run Code Online (Sandbox Code Playgroud)
第3个电话:
static {
new Test1();
// Here Object is getting created so all Instance Initialzer will be called first in a sequential manner.
}
Run Code Online (Sandbox Code Playgroud)
第四个电话:
{
add(6); // print 6
}
Run Code Online (Sandbox Code Playgroud)
第5个电话:
{
add(8); // print 8
}
Run Code Online (Sandbox Code Playgroud)
第6次电话:
{
add(11); // print 11
}
Run Code Online (Sandbox Code Playgroud)
第7次调用:在Instance Initializer之后,将调用Explicit Default Constructor.
public Test1() {
add(5); // print 5
System.out.println("Constructor!"); // print Constructor!
}
Run Code Online (Sandbox Code Playgroud)
第8次调用:再次调用最后一个静态块.
static {
add(12); // print 12
}
Run Code Online (Sandbox Code Playgroud)
第9次调用:最后将调用main方法
public static void main(String[] args) {
System.out.println("Main method!"); // print Main method!
add(10); // print 10
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |