1. 程式人生 > >類的加載順序

類的加載順序

才會 new對象 ring prot spa 銷毀 finalize 父類 blog

 1 package com.jdk7.chapter2.initorder;
 2 
 3 public class Parent {
 4     private int ix = 50;    //類變量
 5     private static int iz = getNext(30);    //類的靜態變量
 6     //初始化代碼塊
 7     {
 8         System.out.println("Parent初始化代碼塊");
 9         int x = 100;
10         int y = getNext(x);
11     }
12     //靜態初始化代碼塊
13 static{ 14 System.out.println("Parent靜態初始化代碼塊"); 15 int sx = 100; 16 int sy = getNext(sx); 17 } 18 public Parent(){ 19 System.out.println("Parent構造函數"); 20 } 21 public void display(){ 22 System.out.println("Parent的display方法被調用"); 23 System.out.println("ix = "+this
.ix); 24 displayA(); 25 } 26 27 private static void displayA() { 28 System.out.println("Parent的displayA方法被調用"); 29 } 30 private static int getNext(int i) { 31 System.out.println("Parent的getNext被調用"); 32 return 0; 33 } 34 protected void finalize(){
35 System.out.println("Parent的銷毀方法"); 36 } 37 }
 1 package com.jdk7.chapter2.initorder;
 2 
 3 public class Child extends Parent {
 4     //初始化塊
 5     {
 6         System.out.println("Child的初始化塊");
 7     }
 8     //靜態初始化塊
 9     static{
10         System.out.println("Child的靜態初始化塊");
11     }
12     public Child(){
13         super();
14         System.out.println("Child的構造函數");
15     }
16     public static void displayB(){
17         System.out.println("Child的displayB方法被調用");
18     }
19     public void finalize(){
20         System.out.println("Child的銷毀方法被調用");
21         super.finalize();
22         
23     }
24 }
 1 package com.jdk7.chapter2.initorder;
 2 
 3 public class InitOrderTest {
 4     public static void main(String[] args) {
 5         System.out.println("不new對象,訪問靜態方法的輸出:");
 6         Child.displayB();
 7         System.out.println();
 8 
 9     }
10 }
11 
12 執行結果:
13 不new對象,訪問靜態方法的輸出:
14 Parent的getNext被調用
15 Parent靜態初始化代碼塊
16 Parent的getNext被調用
17 Child的靜態初始化塊
18 Child的displayB方法被調用
 1 public class InitOrderTest {
 2     public static void main(String[] args) {
 3         System.out.println("new對象,訪問靜態方法的輸出");
 4         new Child().displayB();
 5         System.gc();        
 6     }
 7 }
 8 
 9 執行結果:
10 new對象,訪問靜態方法的輸出
11 Parent的getNext被調用
12 Parent靜態初始化代碼塊
13 Parent的getNext被調用
14 Child的靜態初始化塊
15 Parent初始化代碼塊
16 Parent的getNext被調用
17 Parent構造函數
18 Child的初始化塊
19 Child的構造函數
20 Child的displayB方法被調用
21 Child的銷毀方法被調用
22 Parent的銷毀方法

(1) 對於每個類,java虛擬機只加載一次,在加載時,初始化類的靜態方法、靜態變量、和靜態初始化快;

(2) 只有在新建一個對象時,才會按先父類再子類的順序,初始化類的初始化塊和構造函數,若只訪問靜態方法,java虛擬即不會初始化這些塊;

(3) System的gc方法通知java虛擬機進行垃圾回收,垃圾回收是異步的,回收時調用類的finalize方法

類的加載順序