無父類
加載順序
為靜態變量開辟空間(默認初始化),然后顯示初始化靜態代碼塊靜態方法new語句明確首地址,在堆內存中為對象開辟相應大小的空間(默認初始化),此時有了this這一概念成員變量的顯示初始化。構造代碼塊構造函數代碼
public class Main { public static void main(String args[]) { /*1*/ Demo a=new Demo(); /*堆*/// /*2*/// Demo.funtion2();// /*3*/// Demo b=new Demo();// b.funtion1();// /*4*/// Demo c=new Demo();// System.out.PRintln(c.dNum1);// /*5*/// Demo d=new Demo();// System.out.println(d.dNum2);// /*6*/// System.out.println(Demo.dNum3);// /*7*/// System.out.println(Demo.dNum4); }}class Demo{ int dNum1=5; /*堆*/ final int dNum2=10; /*堆*/ static int dNum3=15; /*堆->方法區->靜態方法區*/ final static int dNum4=20; /*堆->方法區->常量池*/ { /*堆->方法區*/ System.out.println("構造代碼塊 " + dNum1 + " " + dNum2 + " " + dNum3 + " " + dNum4); } static /*堆->方法區->靜態方法區*/ { System.out.println("靜態代碼塊 " +dNum3 +" "+ dNum4); } Demo() /*堆->方法區*/ { System.out.println("默認構造函數 " + dNum1 + " " + dNum2 + " " + dNum3 + " " + dNum4); } void funtion1() /*堆->方法區*/ { System.out.println("普通成員方法 "+ dNum1 + " " + dNum2 + " " + dNum3 + " " + dNum4); } static void funtion2() /*堆->方法區->靜態方法區*/ { System.out.println("靜態方法 " + dNum3 + " " + dNum4); }}輸出
/* 1 */
靜態代碼塊 15 20 構造代碼塊 5 10 15 20 默認構造函數 5 10 15 20
/* 2 */
靜態代碼塊 15 20 靜態方法 15 20
/* 3 */
靜態代碼塊 15 20 構造代碼塊 5 10 15 20 默認構造函數 5 10 15 20 普通成員方法 5 10 15 20
/* 4 */
靜態代碼塊 15 20 構造代碼塊 5 10 15 20 默認構造函數 5 10 15 20 5
/* 5 */
靜態代碼塊 15 20 構造代碼塊 5 10 15 20 默認構造函數 5 10 15 20 10
/* 6 */
靜態代碼塊 15 20 15
/* 7 */
20
final關鍵字 引用
額外:final關鍵字修飾一個變量時,是引用不能變,還是引用的對象不能變? 答:http://blog.csdn.net/u012110719/article/details/46334413
有父類
加載順序
父類加載,為父類的靜態變量開辟空間(默認初始化),然后顯示初始化父類的靜態代碼塊父類的靜態方法子類的靜態變量開辟空間(默認初始化),然后顯示初始化子類的靜態代碼塊子類的靜態方法父類super這一概念父類成員變量的顯示初始化。父類的構造代碼塊父類的構造函數子類new語句明確首地址,在堆內存中為對象開辟相應大小的空間(默認初始化),此時有了this這一概念子類成員變量的顯示初始化。子類構造代碼塊子類構造函數代碼
public class Main { public static void main(String args[]) { /*1*/ Demo a=new Demo();// /*2*/// Demo.funtion2();// /*3*/// Demo b=new Demo();// b.funtion1();// /*4*/// Demo c=new Demo();// System.out.println(c.dNum1);// /*5*/// Demo d=new Demo();// System.out.println(d.dNum2);// /*6*/// System.out.println(Demo.dNum3);// /*7*/// System.out.println(Demo.dNum4);// /*8*/// Demo d=new Demo();// System.out.println(d.fNum2);// /*9*/// System.out.println(Demo.fNum3);// /*10*/// System.out.println(Demo.fNum4); }}class Demo extends Father{ int dNum1=5; /*堆*/ final int dNum2=10; /*堆*/ static int dNum3=15; /*靜態方法區*/ final static int dNum4=20; /*常量池*/ { System.out.println("子類的 構造代碼塊 " + dNum1 + " " + dNum2 + " " + dNum3 + " " + dNum4); } static { System.out.println("子類的 靜態代碼塊 " +dNum3 +" "+ dNum4); } Demo() { System.out.println("子類的 默認構造函數 " + dNum1 + " " + dNum2 + " " + dNum3 + " " + dNum4); } void funtion1() { System.out.println("子類的 普通成員方法 "+ dNum1 + " " + dNum2 + " " + dNum3 + " " + dNum4); } static void funtion2() { System.out.println("子類的 靜態方法 " + dNum3 + " " + dNum4); }}class Father{ int fNum1=-5; /*堆*/ final int fNum2=-10; /*堆*/ static int fNum3=-15; /*靜態方法區*/ final static int fNum4=-20; /*常量池*/ { System.out.println("父類的 構造代碼塊 " + fNum1 + " " + fNum2 + " " + fNum3 + " " + fNum4); } static { System.out.println("父類的 靜態代碼塊 " +fNum3 +" "+ fNum4); } Father() { System.out.println("父類的 默認構造函數 " + fNum1 + " " + fNum2 + " " + fNum3 + " " + fNum4); } void funtion1() { System.out.println("父類的 普通成員方法 "+ fNum1 + " " + fNum2 + " " + fNum3 + " " + fNum4); } static void funtion2() { System.out.println("父類的 靜態方法 " + fNum3 + " " + fNum4); }}輸出
/* 1 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 父類的 構造代碼塊 -5 -10 -15 -20 父類的 默認構造函數 -5 -10 -15 -20 子類的 構造代碼塊 5 10 15 20 子類的 默認構造函數 5 10 15 20
/* 2 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 子類的 靜態方法 15 20
/* 3 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 父類的 構造代碼塊 -5 -10 -15 -20 父類的 默認構造函數 -5 -10 -15 -20 子類的 構造代碼塊 5 10 15 20 子類的 默認構造函數 5 10 15 20 子類的 普通成員方法 5 10 15 20
/* 4 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 父類的 構造代碼塊 -5 -10 -15 -20 父類的 默認構造函數 -5 -10 -15 -20 子類的 構造代碼塊 5 10 15 20 子類的 默認構造函數 5 10 15 20 5
/* 5 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 父類的 構造代碼塊 -5 -10 -15 -20 父類的 默認構造函數 -5 -10 -15 -20 子類的 構造代碼塊 5 10 15 20 子類的 默認構造函數 5 10 15 20 10
/* 6 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 15
/* 7 */
20
/* 8 */
父類的 靜態代碼塊 -15 -20 子類的 靜態代碼塊 15 20 父類的 構造代碼塊 -5 -10 -15 -20 父類的 默認構造函數 -5 -10 -15 -20 子類的 構造代碼塊 5 10 15 20 子類的 默認構造函數 5 10 15 20 -10
/* 9 */
父類的 靜態代碼塊 -15 -20 -15
/* 10 */
-20