類的加載順序
阿新 • • 發佈:2018-01-14
才會 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方法
類的加載順序