1,一個之類只能繼承一個父類,存在單繼承侷限
錯誤程序: class A {} class B {} classC extends A,B{} // 一個子類繼承了兩個父類 |
正確程序: class A {} class B extends A {} classC extends B {} //這種操作稱爲多層繼承 |
結論:Java之中只允許多層繼承,不允許多重繼承,Java存在單繼承侷限。
2,在一個子類繼承的時候,實際上會繼承父類之中的所有操作(屬性、方法),但是需要注意的是,對於所有的非私有(no private)操作屬於顯式繼承(可以直接利用對象操作),而所有的私有操作屬於隱式繼承(間接完成)。
class A { private String msg ; public void setMsg(String msg) { this.msg = msg ; } public String getMsg() { return this.msg ; } } class B extends A { public void print() { System.out.println(msg) ; // 錯誤: msg可以在A中訪問private } } public class Test { public static void main(String args[]) { B b = new B() ; b.setMsg("張三") ; System.out.println(b.getMsg()) ; } } |
3,在繼承關係之中,如果要實例化子類對象,會默認先調用父類構造,爲父類之中的屬性初始化,之後再調用子類構造,爲子類之中的屬性初始化,即:默認情況下,子類會找到父類之中的無參構造方法。
class A { public A() { //父類無參構造 System.out.println("*************************"); } } class B extends A { public B() { //子類構造 super() ; // 調用父類構造 System.out.println("#########################"); } } public class Test { public static void main(String args[]) { B b = new B() ; //實例化子類對象 } } |
現在默認調用的是無參構造,而如果這個時候父類沒有無參構造,則子類必須通過super()調用指定參數的構造方法。
class A { public A(String msg) { //父類構造 System.out.println("*************************"); } } class B extends A { public B() { //子類構造 super("Hello") ; //調用父類構造 System.out.println("#########################"); } } public class Test { public static void main(String args[]) { B b = new B() ; //實例化子類對象 } } |
在任何的情況下,子類都逃不出父類構造的調用,但是,既然super()可以調用父類構造,那麼這個語法和this()很相似,那麼很明顯了,super調用父類構造的時候,一定要放在構造方法的首行上。