2017年8月12日 星期六

Chapter 07: 重複運用Classes

base class的初始化
  • Java編譯器會自動在derived class建構式中插入base class建構式的呼叫動作。
  • class A{
        A() {print("new A");}
    }

    class B extends A{
        B() {print("new B");};
    }

    public class C extends B{
        public C() {print("new C");}
        public static void main(String[] args){
              C instance = new C();
        }
    }
    Output =>
    new A
    new B
    new C
  • 如果沒有在class中定義預設constructor,編譯器會自動產生一個。
  • 如果定義了一個(不論是否有帶引數的)constructor,編譯器就不會產生預設constructor。
Name hiding
  • 若在derived class中新增overload的method,C++會把base class中同名的method遮蔽掉,但JAVA不會。
複合 vs. 繼承
  • 面對複合跟繼承的選擇時,考慮是否需要做"向上轉型",有需要才選繼承。
關鍵字final
  • final data
    • 不能改變的常數
  • final method
    • 確保此method在繼承過程中不能被override
    • 允許compiler將此method轉化為inline呼叫
  • final class
    • 此class不能被繼承
補充: 重要範例 1 !!
父類別
public class Super {
    static String s = "Super=====";
    static {  //類別的初始化
         System.out.println("instance super class static");
    }
    {  //類別物件的建立
         System.out.println("instance super class");
    }
    public Super(){  //建構子
         System.out.println("into Super constructor");
    }
}

子類別
public class Sub extends Super{
    static String s1 = "Sub1-----";
    static String s2 = "Sub2-----";
    static {  //類別的初始化
         System.out.println("instance sub class static");
    }
    {  //類別物件的建立
         System.out.println("instance sub class");
    }
    public Sub(){  //建構子
         System.out.println("into Sub constructor");
    }
}

Main類別
public class Main {
    public static void main(String[] arg){
         Sub sub = new Sub();
    }
}

執行結果
instance super class static
instance sub class static
instance super class
into Super constructor
instance sub class
into Sub constructor

補充: 重要範例 2 !!
Main類別
public class Main {
    public static void main(String[] arg){
         System.out.println(Sub.s);
         System.out.println(Sub.s1);
    }
}

執行結果
instance super class static
Super=====
//此時Sub類別並不會進行類別的初始化
instance sub class static
Sub1-----
//此時Sub類別才有進行類別的初始化動作

沒有留言:

張貼留言