題目要求:輸出執行結果:
public class text
static
public text(string str)
public static int print(string str)
public static void main (string args)
}
執行結果如下:
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:i 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
首先看到static
關鍵字,腦子裡面第一反應有幾點,
1、公有屬性,可以有類名稱直接訪問。
2、靜態方法,可以有類名稱直接方法。
3、靜態方法或者屬性,可以再物件例項化之前就呼叫
至於該題中,順序執行,先執行publicstaticintk=0 ;
因為沒有輸出不用考慮這個,接著publicstatictext t1= newtext("t1") ;
在t1物件初始化時先執行非靜態方法或者非靜態常量,順序執行,接著執行構造引數,
根據程式來看應該列印三條記錄,分別是
1:j i=0 n=0
2:構造塊 i=1 n=1
3:t1 i=2 n=2
接下來publicstatictext t2= newtext("t2") ;
同理,執行完之後繼續執行
static**塊或者賦值靜態變數,在main()方法中new了乙個新的例項,靜態變數只執行一次,接下來就是順序執行非靜態方法---->構造方法。應該是這樣的順序,面試的時候我寫的不完成,哎。
接著想到繼承關係(extends
)子類繼承乙個父類之後,物件初始化的順序又是怎樣?
我寫了乙個
demo,
class a
public a()
} class b extends a
public b()
} public class demo
}
輸入結果如下:
父類靜態方法
子類靜態方法
父類非靜態方法
父類構造
子類非靜態方法
子類構造
最後總結了幾點:
1 /*
2 * 幾大原則
3 * 一、靜態成員變數(static)
4 * 1、靜態成員變數為類變數,所有物件共享同一記憶體空間
5 * 2、靜態成員變數的宣告和定義僅在首次載入類時執行一次
6 * 3、首次載入類時首先對所有靜態成員變數根據型別預設賦初值,然後再對有右值的附右值
7 * 二、靜態初始塊
8 * 1、靜態初始化塊僅在首次載入類時執行一次
9 * ······多個靜態成員變數與靜態始化快參照出現順序先後執行······
10 * 三、動態成員變數
11 * 1、動態成員變數定義在每次例項化物件時在建構函式之前執行
12 * 四、動態初始化塊
13 * 1、動態初始化塊在每次例項化物件時在建構函式之前執行
14 * ······多個動態成員變數與動態初始化塊參照出現順序先後執行······
15 * 總結:總的來說,在不涉及繼承的前提下,當首次載入類時,按照如下順序執行
16 * 1、按照出現順序先後執行靜態成員變數定義與靜態初始化塊
17 * 2、按照出現順序先後執行動態成員變數定義與動態初始化塊
18 * 3、執行建構函式
19 * 再次例項化物件時只執行第2、3步即可
20 *
21 * ············成員變數與定義與初始化塊先於建構函式執行·········
22 * 五、當涉及到繼承時,按照如下順序執行
23 * 1、執行父類的靜態成員變數定義與靜態初始化塊,執行子類的靜態成員變數定義與靜態初始化塊
24 * 2、執行父類的非靜態成員變數定義與動態初始化塊,執行父類構造方法
25 * 3、執行子類的非靜態成員變數定義與動態初始化塊,執行子類構造方法
26 * 另:父類構造方法中用到的方法如果已被子類重寫,那麼在構造子類物件時在呼叫父類建構函式中使用子類重寫的方法
類中的靜態 非靜態方法
c 的類中可以包含兩種方法 靜態方法和非靜態方法。使用了static 修飾符的方法為靜態方法,反之萴是非靜態方法。靜態方琺是 種 特殊的成園方琺,它不屬紆類的某乙個具體的實唎,而是屬於類本裑。葰以對靜態方法不需要首先建立乙個類哋例項,而是採用類名.靜態方法的格式 1.static方法是類中的乙個成園...
類中的靜態 非靜態方法
c 的類中可以包含兩種方法 靜態方法和非靜態方法。使用了static 修飾符的方法為靜態方法,反之萴是非靜態方法。靜態方琺是 種 特殊的成園方琺,它不屬紆類的某乙個具體的實唎,而是屬於類本裑。葰以對靜態方法不需要首先建立乙個類哋例項,而是採用類名.靜態方法的格式 1.static方法是類中的乙個成園...
C 靜態類 靜態方法與非靜態方法比較
在類 class 上加入static修飾,表示該類無法被例項化,並將該類中,無法例項化變數或函式 靜態類的主要特性 所以,可以在普通類中新增靜態方法,但是靜態類中的方法 變數都必須是靜態的。一 靜態方法 使用static修改的方法就是靜態方法,否則就是非靜態方法。二 1 靜態成員屬於類的所以,非靜態...