一、很重要!!! 例子: package Servlet.day0811.am; public class StaticTest { static StaticTest st=new StaticTest(); static{ System.out.println("靜態代碼塊"); } public StaticTest(){ System.out.println("構造器"); System.out.println(st); m1(); } public static void m1(){ System.out.println("m1靜態方法"); System.out.println(st); } { System.out.println("普通代碼塊"); } public static void main(String[] args) { System.out.println("main開始"); StaticTest.m1(); System.out.println("main結束"); } } -------------------------------------結果以下------------------------------------- 普通代碼塊 (先加載普通代碼塊) 構造器 (再加載構造器) null (輸出構造器中的st,此時並未加載靜態屬性,因此輸出null) m1靜態方法 (構造器中的m1方法,輸出m1靜態方法) null (m1方法中的st,此時st仍然未被加載) 靜態代碼塊 (加載靜態代碼塊) main開始 (main方法開始,st在這時候被加載(分配內存)) m1靜態方法 (調用靜態方法m1) Servlet.day0811.am.StaticTest@d1f24bb (st已經被加載過了,因此爲對象對應的地址) main結束 (main方法結束) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 二、 一、虛擬機在首次加載Java類時,會對靜態初始化塊、靜態成員變量、靜態方法進行一次初始化 二、只有在調用new方法時纔會建立類的實例 三、類實例建立過程:按照父子繼承關係進行初始化,首先執行父類的初始化塊部分,而後是父類 的構造方法;再執行本類繼承的子類的初始化塊,最後是子類的構造方法 四、類實例銷燬時候,首先銷燬子類部分,再銷燬父類部分 public class Dervied extends Base{ private String name="dervied"; public Dervied(){ System.out.println(new Base().i); tellName(); printName(); } static{ System.out.println("子類靜態代碼塊"); } public void tellName(){ System.out.println("Dervied tell name : "+name); } public void printName(){ System.out.println("Dervied print name : "+name); } public static void main(String[] args) { new Dervied(); } } class Base{ public int i=99; private String name="111"; static{ System.out.println("父類靜態代碼塊"); } { System.out.println("父類非靜態代碼塊"); } public Base(){ tellName(); printName(); } public void tellName(){ System.out.println("Base tell name : "+name); } public void printName(){ System.out.println("Base print name : "+name); } }
-------------------------------------結果以下-------------------------------------
父類靜態代碼塊ide
子類靜態代碼塊this
父類非靜態代碼塊spa
Dervied tell name : null對象
Dervied print name : null繼承
父類非靜態代碼塊內存
Base tell name : 111虛擬機
Base print name : 111it
99class
Dervied tell name : dervied變量
Dervied print name : dervied
++++++++++++++++++++++++++作以下修改++++++++++++++++++++++++++++
將main方法裏面new Dervied( ) 改成:System.out.println("hello");
結果爲:
父類靜態代碼塊
子類靜態代碼塊
hello
============================================================
三、
class Farther{
public static int a=2;
public int b=3;
{
System.out.println("非靜態代碼塊:b="+b);
}
static{
a=4;
System.out.println("靜態代碼塊:a="+a);
}
public Farther(){
System.out.println("父類構造器");
this.s();
}
public void s(){
System.out.println("父類方法");
}
}
public class Son extends Farther{
public Son(){
System.out.println("子類構造器");
}
public static void main(String[] args) {
Farther f=new Son();
f.s();
}
public void s(){
super.s();
System.out.println("子類方法");
}
}
-------------------------------------結果以下-------------------------------------
靜態代碼塊:a=4
非靜態代碼塊:b=3
父類構造器
父類方法
子類方法
子類構造器
父類方法
子類方法
==========================================================
四、
public class InitializeDemo {
private static int k=1;
private static InitializeDemo t1=new InitializeDemo("t1");
private static InitializeDemo t2=new InitializeDemo("t2");
private static int i=print("1");
private static int n=99;
static{
print("靜態代碼塊");
}
private int j=print("j");
{
print("非靜態代碼塊");
}
public InitializeDemo(String str){
System.out.println(k++ + " : "+ str +" i="+i+" n="+n);
++i;
++n;
}
public static int print(String str){
System.out.println(k++ + " : "+ str +" i="+i+" n="+n) ;
++n;
return ++i;
}
public static void main(String[] args) {
new InitializeDemo("init");
}
}
-------------------------------------結果以下-------------------------------------
1 : j i=0 n=0
2 : 非靜態代碼塊 i=1 n=1
3 : t1 i=2 n=2
4 : j i=3 n=3
5 : 非靜態代碼塊 i=4 n=4
6 : t2 i=5 n=5
7 : 1 i=6 n=6
8 : 靜態代碼塊 i=7 n=99
9 : j i=8 n=100
10 : 非靜態代碼塊 i=9 n=101
11 : init i=10 n=102