繼承的限制

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調用父類構造的時候,一定要放在構造方法的首行上


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章