import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner cin = new Scanner(System.in);A b = new B(8);System.out.println(A.aa + " " + B.bb);}}class A {int a = f();static int aa = sf();static {aa = 11;System.out.println("A kuai static " + aa);}{aa = 111;a = 1;System.out.println("A kuai " + a);}A() {System.out.println("A constract begin. " + a);}A(int r) {System.out.println("A constract begin. " + a);}int f() {System.out.println("A kuai f");return 2;}static int sf() {System.out.println("A kuai sf");return 22;}}class B extends A {static int bb = sfun();int b = fun();static {bb = 44;System.out.println("B kuai static " + bb);}{b = 4;System.out.println("B kuai " + b);}B() {System.out.println("B constract begin. " + b);}B(int r) {System.out.println("B constract begin." + b);}int fun() {System.out.println("B kuai fun");return 3;}static int sfun() {System.out.println("B kuai sfun");return 33;}}/*A kuai sfA kuai static 11B kuai sfunB kuai static 44A kuai fA kuai 1A constract begin. 1B kuai funB kuai 4B constract begin.4111 44*/
初始化順序:
父類的靜態變數、子類的靜態變數、父類的執行個體變數、父類的構造方法、子類的執行個體變數、子類的構造方法
其中靜態變數的初始化:
1)。定義時,2)。靜態塊;初始化順序按照他們在代碼中的順序初始化;
執行個體變數的初始化:
1)。定義時,2)。靜態塊,3)。構造方法;
其中1、2先於3)執行,對於1、2按照其在代碼中的順序執行。
都是先定義,開闢記憶體,賦給其初始值(null,0等),最後按照指派陳述式賦值,就是最終的值。
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner cin = new Scanner(System.in);System.out.println(A.sf());}}class A {static A Aa = new A(2);static int aa = 11;int a = 1;static {System.out.println("static " + aa);}{System.out.println("A kuai " + a);}A() {sf();System.out.println("A constract begin. " + a + " " + aa + " " + " "+ sf());}A(int r) {sf();System.out.println("A constract begin. " + a + " " + aa + " " + " "+ sf());}int f() {System.out.println("A kuai f " + a);return a;}static int sf() {System.out.println("A kuai sf " + aa);return aa;}}/*A kuai 1A kuai sf 0A kuai sf 0A constract begin. 1 0 0static 11A kuai sf 1111 */
A kuai 1
為什麼會輸出來呀?為什麼靜態變數是0,而執行個體變數卻有值呀!
這樣是不是和上面的描述有了矛盾呀?不懂?請路過的大牛指導!謝謝!