在看android源碼的時(shí)候看到了好久不見(jiàn)的靜態(tài)代碼塊,寫個(gè)小栗子來(lái)回憶一下這部分。
包含靜態(tài)代碼塊的類A:
class A{
static int va = 1;
static String sa = "1";
public A(){
System.out.println("構(gòu)造方法a");
}
{
System.out.println("代碼塊a");
}
static{
System.out.println("靜態(tài)代碼塊a");
}
static{
System.out.println("靜態(tài)代碼塊a1");
}
public static void printStaticValue(){
System.out.println(sa);
}
public void printValue(){
System.out.println("=====a=====");
System.out.println(va);
System.out.println(sa);
}
}
繼承父類A并且同樣包含靜態(tài)代碼塊的類B:
class B extends A{
public B(){
System.out.println("構(gòu)造方法b");
}
{
System.out.println("代碼塊b");
}
static{
System.out.println("靜態(tài)代碼塊b1");
}
static{
System.out.println("靜態(tài)代碼塊b");
}
public void printValue(){
System.out.println("=====super=====");
super.printValue();
System.out.println("=====b=====");
System.out.println(va);
System.out.println(sa);
}
}
調(diào)用上面的類:
public class Teststatic {
public static void main(String[] args) {
System.out.println("------b--------");
B b = new B();
System.out.println("------b again--------");
b = new B();
System.out.println("------b1--------");
B b1 = new B();
System.out.println("------通過(guò)b1來(lái)打印一下靜態(tài)變量");
b1.printValue();
}
}
運(yùn)行結(jié)果如下:
------b--------
靜態(tài)代碼塊a
靜態(tài)代碼塊a1
靜態(tài)代碼塊b1
靜態(tài)代碼塊b
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b again--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b1--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------通過(guò)b1來(lái)打印一下靜態(tài)變量
=====super=====
=====a=====
1
1
=====b=====
1
1
可以看到無(wú)論生成多少個(gè)對(duì)象,靜態(tài)代碼塊只執(zhí)行一次,且靜態(tài)代碼塊之間按照書寫順序來(lái)執(zhí)行。
在上面基礎(chǔ)上添加一行類調(diào)用靜態(tài)方法的代碼:
public class Teststatic {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("------我先來(lái)執(zhí)行以下靜態(tài)方法-------");
B.printStaticValue();//雖然b中沒(méi)有該靜態(tài)方法,但是繼承了A,所以也就繼承了A中的公共方法
System.out.println("------b--------");
B b = new B();
System.out.println("------b again--------");
b = new B();
System.out.println("------b1--------");
B b1 = new B();
System.out.println("------通過(guò)b1來(lái)打印一下靜態(tài)變量");
b1.printValue();
}
}
運(yùn)行結(jié)果如下:
------我先來(lái)執(zhí)行以下靜態(tài)方法-------
靜態(tài)代碼塊a
靜態(tài)代碼塊a1
1
------b--------
靜態(tài)代碼塊b1
靜態(tài)代碼塊b
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b again--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------b1--------
代碼塊a
構(gòu)造方法a
代碼塊b
構(gòu)造方法b
------通過(guò)b1來(lái)打印一下靜態(tài)變量
=====super=====
=====a=====
1
1
=====b=====
1
1
可以看到通過(guò)類調(diào)用靜態(tài)方法時(shí)同樣會(huì)先執(zhí)行靜態(tài)代碼塊。
【待續(xù)...】
相關(guān)博文:
兩個(gè)例子徹底搞懂Java類屬性,代碼塊,構(gòu)造方法的執(zhí)行順序
為什么構(gòu)造代碼塊先于構(gòu)造函數(shù)執(zhí)行?