靜態代碼塊:用staitc聲明,jvm加載類時執行,僅執行一次
構造代碼塊:類中直接用{}定義,每一次創建對象時執行。
執行順序優先級:靜態塊, main(),函數,構造塊,構造方法。
構造函數
public HelloA(){//構造函數
}
關于構造函數,以下幾點要注意:
1.對象一建立,就會調用與之相應的構造函數,也就是說,不建立對象,構造函數時不會運行的。
2.構造函數的作用是用于給對象進行初始化。
3.一個對象建立,構造函數只運行一次,而一般方法可以被該對象調用多次。
構造代碼塊
{//構造代碼塊
}
關于構造代碼塊,以下幾點要注意:
- 構造代碼塊的作用是給對象進行初始化。
- 對象一建立就運行構造代碼塊了,而且優先于構造函數執行。這里要強調一下,有對象建立,才會運行構造代碼塊,類不能調用構造代碼塊的,而且構造代碼塊與構造函數的執行順序是前者先于后者執行。
- 構造代碼塊與構造函數的區別是:構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什么樣的對象,但無論建立哪個對象,都會先執行相同的構造代碼塊。也就是說,構造代碼塊中定義的是不同對象共性的初始化內容。
靜態代碼塊
static {//靜態代碼塊
}
關于靜態代碼塊,要注意的是:
- 它是隨著類的加載而執行,只執行一次,并優先于主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然后才執行主函數的。
- 靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。
- 靜態代碼塊中的變量是局部變量,與普通函數中的局部變量性質沒有區別。
- 一個類中可以有多個靜態代碼塊
public class Test{
staitc int cnt=6;
static{
cnt+=9;
}
public static void main(String[] args) {
System.out.println(cnt);
}
static{
cnt/=3;
}
}
運行結果:
5
例子1:
public class HelloA {
public HelloA(){//構造函數
System.out.println("A的構造函數");
}
{//構造代碼塊
System.out.println("A的構造代碼塊");
}
static {//靜態代碼塊
System.out.println("A的靜態代碼塊");
}
public static void main(String[] args) {
}
}
運行結果:
A的靜態代碼塊
例子2:
public class HelloA {
public HelloA(){//構造函數
System.out.println("A的構造函數");
}
{//構造代碼塊
System.out.println("A的構造代碼塊");
}
static {//靜態代碼塊
System.out.println("A的靜態代碼塊");
}
public static void main(String[] args) {
HelloA a=new HelloA();
}
}
運行結果:
A的靜態代碼塊
A的構造代碼塊
A的構造函數
例子3:
public class HelloA {
public HelloA(){//構造函數
System.out.println("A的構造函數");
}
{//構造代碼塊
System.out.println("A的構造代碼塊");
}
static {//靜態代碼塊
System.out.println("A的靜態代碼塊");
}
public static void main(String[] args) {
HelloA a=new HelloA();
HelloA b=new HelloA();
}
}
運行結果:
A的靜態代碼塊
A的構造代碼塊
A的構造函數
A的構造代碼塊
A的構造函數
對于一個類而言,按照如下順序執行:
- 執行靜態代碼塊
- 執行構造代碼塊
- 執行構造函數
例子4:
public class HelloA {
public HelloA(){//構造函數
System.out.println("A的構造函數");
}
{//構造代碼塊
System.out.println("A的構造代碼塊");
}
static {//靜態代碼塊
System.out.println("A的靜態代碼塊");
}
}
public class HelloB extends HelloA{
public HelloB(){//構造函數
System.out.println("B的構造函數");
}
{//構造代碼塊
System.out.println("B的構造代碼塊");
}
static {//靜態代碼塊
System.out.println("B的靜態代碼塊");
}
public static void main(String[] args) {
HelloB b=new HelloB();
}
}
運行結果:
A的靜態代碼塊
B的靜態代碼塊
A的構造代碼塊
A的構造函數
B的構造代碼塊
B的構造函數
當涉及到繼承時,按照如下順序執行:
- 執行父類的靜態代碼塊,并初始化父類靜態成員變量
- 執行子類的靜態代碼塊,并初始化子類靜態成員變量
- 執行父類的構造代碼塊,執行父類的構造函數,并初始化父類普通成員變量
- 執行子類的構造代碼塊, 執行子類的構造函數,并初始化子類普通成員變量