1、虛擬機在首次加載Java類時,會對靜態初始化塊、靜態成員變量、靜態方法進行一次初始化
2、只有在調用new方法時才會創建類的實例
3、類實例創建過程:按照父子繼承關系進行初始化,首先執行父類的初始化塊部分,然后是父類的構造方法;再執行本類繼承的子類的初始化塊,最后是子類的構造方法
4、類實例銷毀時候,首先銷毀子類部分,再銷毀父類部分
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class Parent { public static int t = parentStaticMethod2(); { System.out.println( "父類非靜態初始化塊" ); } static { System.out.println( "父類靜態初始化塊" ); } public Parent() { System.out.println( "父類的構造方法" ); } public static int parentStaticMethod() { System.out.println( "父類類的靜態方法" ); return 10 ; } public static int parentStaticMethod2() { System.out.println( "父類的靜態方法2" ); return 9 ; } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super .finalize(); System.out.println( "銷毀父類" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class Child extends Parent { { System.out.println( "子類非靜態初始化塊" ); } static { System.out.println( "子類靜態初始化塊" ); } public Child() { System.out.println( "子類的構造方法" ); } public static int childStaticMethod() { System.out.println( "子類的靜態方法" ); return 1000 ; } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super .finalize(); System.out.println( "銷毀子類" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Parent.parentStaticMethod(); // Child child = new Child(); } } |
輸出
1
2
3
|
父類的靜態方法2 父類靜態初始化塊 父類類的靜態方法 |
類中static 方法在第一次調用時加載,類中static成員按在類中出現的順序加載。當調用靜態方法2時輸出
1
2
3
|
父類的靜態方法2 父類靜態初始化塊 父類的靜態方法2 |
注釋掉Parent.parentStaticMethod();
去掉注釋Child child = new Child();
1
2
3
4
5
6
7
|
父類的靜態方法 2 父類靜態初始化塊 子類靜態初始化塊 父類非靜態初始化塊 父類的構造方法 子類非靜態初始化塊 子類的構造方法 |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
原文鏈接:http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html