您的位置:首页 > 编程语言 > Java开发

Java类中字段和方法的初始化顺序(包含static)

2015-10-30 16:32 453 查看
Java类中字段和方法的初始化顺序(包含static)

<span style="font-family:Times New Roman;font-size:14px;">package cm.java.Practic5;

class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}

void f1(int marker) {
System.out.println("f1(" + marker + ")");
}
}

class Table {
static Bowl bowl1 = new Bowl(1);

Table() {
System.out.println("Table()");
bowl2.f1(1);
}

void f2(int marker) {
System.out.println("f2(" + marker + ")");
}

static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);

public Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}

void f3(int marker) {
System.out.println("f3(" + marker + ")");
}

static Bowl bowl5 = new Bowl(5);
}

public class InitRelatedP95 {
public static void main(String[] args) {
System.out.println("Creating new cupboard() in main");
new Cupboard();
System.out.println("Creating new cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}

static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}

/*
output:

Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)

*/
</span>

上面是一段程序,运行的结果,我也贴出来了,根据这个输出结果就可以看出JAVA中的初始化顺序:
主题思想就是:先静态对象而后非静态对象,静态对象只能初始化一次,类中的数据成员按顺序初始化。

1:

static Table table = new Table();
 Table对象初始化,进入到Table中,按顺序初始化两个静态Bowl

static Bowl bowl1 = new Bowl(1);//输出Bowl(1)
static Bowl bowl2 = new Bowl(2);//输出Bowl(2)
然后,Table()本身构造函数初始化:

Table() {
System.out.println("Table()");
bowl2.f1(1);
}
//输出Table()
//输出f1(1)
这里总共输出了:

Bowl(1)

Bowl(2)

Table()

f1(1)

2:

static Cupboard cupboard = new Cupboard();
Cupboard对象初始化,进入到Cupboard中,按顺序初始化两个静态Bowl

static Bowl bowl4 = new Bowl(4);//输出Bowl(4)
static Bowl bowl5 = new Bowl(5);//输出Bowl(5)
然后,数据成员初始化,即:

Bowl bowl3 = new Bowl(3);//输出Bowl(3)
接着,Cupboard()本身构造函数初始化:

public Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
//输出Cupboard()
//输出f1(2)

这里总共输出了:

Bowl(4)

Bowl(5)

Bowl(3)

Cupboard()

f1(2)

3

进入到main函数,main也是static的方法,按顺序执行:

System.out.println("Creating new cupboard() in main"); //输出Creating new cupboard() in main

new Cupboard();

Cupboard对象初始化,进入到Cupboard中:

两个静态Bowl,已经初始化过,无需再次初始化;

然后,数据成员初始化,即:

Bowl bowl3 = new Bowl(3);//输出Bowl(3)
接着,Cupboard()本身构造函数初始化:

public Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
//输出Cupboard()
//输出f1(2)
System.out.println("Creating new cupboard() in main");
//输出Creating new cupboard() in main

new Cupboard();

Cupboard对象初始化,进入到Cupboard中:

两个静态Bowl,已经初始化过,无需再次初始化;

然后,数据成员初始化,即:

Bowl bowl3 = new Bowl(3);//输出Bowl(3)
接着,Cupboard()本身构造函数初始化:

public Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
//输出Cupboard()
//输出f1(2)
table.f2(1);
//调用table.f2(1);,输出f2(1)

cupboard.f3(1);
//调用cupboard.f3(1);,输出f3(1);

这里总共输出了:
Creating new cupboard() in main

Bowl(3)

Cupboard()

f1(2)

Creating new cupboard() in main

Bowl(3)

Cupboard()

f1(2)

f2(1)

f3(1)

所以结果,如上述output所述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA 初始化顺序