close

真的, JAVA內父會call 子喔!!==>  static 加上Overload 在有繼承關係的Constructor 時的有趣行為

可能是學藝不精吧, 一直沒注意到overload 在有繼承關係的Constructor 內call Method 時居然是活的, 有Static 時會執行父代的method, 沒有static 時卻有從父代呼叫子代method 的有趣行為, 但稍一不慎可能就會造成大災難囉!

程式一:

 1.) Son 繼承Father,

 2.) Father 內沒有另外寫Constructor, 但有三個Method 分別為aMethod, bMethod及 cMethod。

 3.) Father的bMethod 內再Call this.aMethod(), aMethod(), this.cMethod()及cMethod()。

 4.) Son 內另外寫Constructor Son(char c) 並在其內Call super.bMethod()

 5.) Son 內另外覆寫aMethod及bMethod

 6.) Son內有main, 其內分別new一個Father 及一個Son, 然後分別Call Father 的 aMethod()及 bMethod()

程式二:

1.)把及Father Son 類別內的 aMethod改為static

2.) 其餘同程式一

程式執行發現在程式一時若經由Son的Constructor Call super.aMethod()後, aMethod內不論call this.bMethod() 或單純 call bMethod時均會call 回Son覆寫的新bMethod()。但若直接Call Father的bMethod() 則不會Call到Son 的bMethod()而依一般想法Call到Father的bMethod()。若把aMethod 改為static 則
不論由Constructor call 或由程式內直call bMethod()均全部正常Call 到Father的bMethod()

程式碼, 執行結果及UML Class Diagram 如下:

 

程式碼1:


  1
  2 public class Father {
  3
  4  public void aMethod(){
  5      System.out.println("This is A Method of Father");
  6  }
  7
  8  public void bMethod(){
  9      System.out.println("This is B Method of Father");
 10      System.out.print("  Father B call this.aMethod: ");
 11      this.aMethod();
 12      System.out.print("  Father B call aMethod: ");
 13      aMethod();
 14      System.out.print("  Father B call this.cMethod: ");
 15      this.cMethod();
 16      System.out.print("  Father B call cMethod: ");
 17      cMethod();
 18   }
 19
 20   public void cMethod(){
 21       System.out.println("This is C Method of Father");
 22   }
 23 }// of Father
 24 
 25 class Son extends Father{
 26
 27   Son(char c){
 28       System.out.println("This is Constructor of Son(char).");
 29       super.bMethod();
 30   }
 31
 32   public void aMethod(){
 33       System.out.println("This is A Method of Son");
 34   }
 35
 36   public void bMethod(){
 37       System.out.println("This is B Method of son");
 38   }
 39
 40 public static void main(String[] args){
 41   System.out.println("1. ===== Create new onject Father f1 =====");
 42   Father f1 = new Father();
 43
 44   System.out.println("2. ===== Create new onject Son s1 =====");
 45   Son s1 = new Son('a');
 46
 47   System.out.println("3. ===== f1 call aMethod =====");
 48   f1.aMethod();
 49
 50   System.out.println("4. ===== f1 call bMethod =====");
 51   f1.bMethod();
 52   
 53   System.out.println("This is main statement");
 54  }// of main
 55
 56 } // of Son

 

程式碼二:


  1
  2  public class Father {
  3
  4  public static void aMethod(){
  5      System.out.println("This is A Method of Father");
  6  }
  7
  8  public void bMethod(){
  9      System.out.println("This is B Method of Father");
 10      System.out.print("  Father B call this.aMethod: ");
 11      this.aMethod();
 12      System.out.print("  Father B call aMethod: ");
 13      aMethod();
 14      System.out.print("  Father B call this.cMethod: ");
 15      this.cMethod();
 16      System.out.print("  Father B call cMethod: ");
 17      cMethod();
 18   }
 19
 20   public void cMethod(){
 21       System.out.println("This is C Method of Father");
 22   }
 23 }// of Father
 24 
 25 class Son extends Father{
 26
 27   Son(char c){
 28       System.out.println("This is Constructor of Son(char).");
 29       super.bMethod();
 30   }
 31
 32   public static void aMethod(){
 33       System.out.println("This is A Method of Son");
 34   }
 35
 36   public void bMethod(){
 37       System.out.println("This is B Method of son");
 38   }
 39
 40 public static void main(String[] args){
 41   System.out.println("1. ===== Create new onject Father f1 =====");
 42   Father f1 = new Father();
 43
 44   System.out.println("2. ===== Create new onject Son s1 =====");
 45   Son s1 = new Son('a');
 46
 47   System.out.println("3. ===== f1 call aMethod =====");
 48   f1.aMethod();
 49
 50   System.out.println("4. ===== f1 call bMethod =====");
 51   f1.bMethod();
 52   
 53   System.out.println("This is main statement");
 54  }// of main
 55
 56 } // of Son

Run.JPG 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 China Camel 的頭像
    China Camel

    工業IT老鬼的宅

    China Camel 發表在 痞客邦 留言(0) 人氣()