普通類、抽象類、接口之間的繼承實現關係圖(參考:類與抽象類接口的關係):ide
下面從執行的結果中,清晰呈現了代碼的執行順序。序號 5~9 說的問題,哪位能明白是咋會兒事的,請在評論區指導一下,謝謝! 函數
1 package test; 2 3 public class ExtentsAndImplements { 4 5 /** 6 * 這塊代碼打開註釋,FatherRootClass()、FatherRootAbstract()、ChildrenClass() 7 * 上面這一串構造函數會在 System.out.println(" call Main() ................") 與 主類構造函數 ExtentsAndImplements() 之間執行【比較很差理解】。 8 **/ 9 // ChildrenClass childrenClass = new ChildrenClass(); 10 11 ExtentsAndImplements (){ 12 System.out.println(" 主類無參構造函數執行:ExtentsAndImplements construct 11111111111111111111"); 13 } 14 15 public static void main(String[] args) { 16 System.out.println(" call Main() ................"); 17 ChildrenClass childrenClass = new ExtentsAndImplements().new ChildrenClass(" new ChildrenClass(param) : "); 18 System.out.println(" ChildrenClass test() ................"); 19 childrenClass.test(); 20 } 21 22 class FatherRootClass { 23 private FatherRootClass(){ 24 System.out.println(" FatherRootClass No construct !!!================="); 25 } 26 private FatherRootClass(String FatherRootClass){ 27 System.out.println(FatherRootClass + " FatherRootClass construct !!!================="); 28 } 29 } 30 31 interface SimpleRootInterface { 32 void run(); 33 } 34 35 abstract class FatherRootAbstract extends FatherRootClass implements SimpleRootInterface{ 36 public FatherRootAbstract(){ 37 System.out.println(" FatherRootAbstract extends FatherRootClass No construct !!! #######################"); 38 } 39 public FatherRootAbstract(String FatherRootAbstract){ 40 super(FatherRootAbstract); 41 System.out.println(FatherRootAbstract + " FatherRootAbstract extends FatherRootClass construct !!! #######################"); 42 } 43 44 abstract void excute(); 45 46 @Override 47 public void run() { 48 this.excute(); 49 System.out.println(" FatherRootAbstract implements SimpleRootInterface.run(). " + 50 "this is FatherRootAbstract'run(). ------333333333333333333333"); 51 } 52 53 } 54 55 class ChildrenClass extends FatherRootAbstract{ 56 public ChildrenClass(){ 57 System.out.println(" ChildrenClass extends FatherRootAbstract No construct !!! @@@@@@@@@@@@@@@@@@@@"); 58 } 59 public ChildrenClass(String begin){ 60 super(begin); 61 System.out.println(begin + " ChildrenClass extends FatherRootAbstract construct !!! @@@@@@@@@@@@@@@@@@@@"); 62 } 63 64 private void test(){ 65 // super.run(); 66 this.run(); 67 this.excute(); 68 System.out.println(" SUCCESS!"); 69 } 70 71 @Override 72 public void excute() { 73 System.out.println(" ChildrenClass extends FatherRootAbstract implements SimpleRootInterface. " + 74 "this is ChildrenClass'excute(). ------666666666666666666666"); 75 } 76 } 77 78 }
運行結果:this
1 call Main() ................ 2 主類無參構造函數執行:ExtentsAndImplements construct 11111111111111111111 3 new ChildrenClass(param) : FatherRootClass construct !!!================= 4 new ChildrenClass(param) : FatherRootAbstract extends FatherRootClass construct !!! ####################### 5 new ChildrenClass(param) : ChildrenClass extends FatherRootAbstract construct !!! @@@@@@@@@@@@@@@@@@@@ 6 ChildrenClass test() ................ 7 ChildrenClass extends FatherRootAbstract implements SimpleRootInterface. this is ChildrenClass'excute(). ------666666666666666666666 8 FatherRootAbstract implements SimpleRootInterface.run(). this is FatherRootAbstract'run(). ------333333333333333333333 9 ChildrenClass extends FatherRootAbstract implements SimpleRootInterface. this is ChildrenClass'excute(). ------666666666666666666666 10 SUCCESS!
其他代碼不變,把序號9 (ChildrenClass childrenClass = new ChildrenClass();)的註釋打開,再執行程序,運行結果爲(結果中的二、三、4 在一、5之間執行,我有點懵,有能看明白的高手,請在評論區點化點化(* ̄︶ ̄) ):spa
1 call Main() ................ 2 FatherRootClass No construct !!!================= 3 FatherRootAbstract extends FatherRootClass No construct !!! ####################### 4 ChildrenClass extends FatherRootAbstract No construct !!! @@@@@@@@@@@@@@@@@@@@ 5 主類無參構造函數執行:ExtentsAndImplements construct 11111111111111111111 6 new ChildrenClass(param) : FatherRootClass construct !!!================= 7 new ChildrenClass(param) : FatherRootAbstract extends FatherRootClass construct !!! ####################### 8 new ChildrenClass(param) : ChildrenClass extends FatherRootAbstract construct !!! @@@@@@@@@@@@@@@@@@@@ 9 ChildrenClass test() ................ 10 ChildrenClass extends FatherRootAbstract implements SimpleRootInterface. this is ChildrenClass'excute(). ------666666666666666666666 11 FatherRootAbstract implements SimpleRootInterface.run(). this is FatherRootAbstract'run(). ------333333333333333333333 12 ChildrenClass extends FatherRootAbstract implements SimpleRootInterface. this is ChildrenClass'excute(). ------666666666666666666666 13 SUCCESS!