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 Anew Bnew 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類別才有進行類別的初始化動作
|
沒有留言:
張貼留言