1 . java中super的用法,是調用父類構造方法?那為什麼不直接繼承,要返回去再調用呢?
調用父類的的構造方法,因為構造方法不能被繼承,所以需要調用父類的,這裡分為兩種情況:1、當父類中有預設的建構函式時,子類自動調用父類的構造方法;2、當父類中有帶參數的建構函式時,子類需要使用super關鍵字調用父類的建構函式,而且必須放在子類構造方法的第一句。任何類都有構造方法,哪怕是你不寫,也會預設有一個有無參構造方法。所以你的A裡面就會有一個叫A()的構造方法。當你new A()時,預設你有一個有無參構造方法A()的方法裡的第一句,會自動加上一個super();的方法,這句就是調用父類構造方法的意思,這是java規定的規則。你可以嘗試一下,在A裡寫一個構造方法:A(){super(); //這個一定要放在第一句System.out..XX;}這與你不寫super()這句效果是一樣的,因如果沒寫,java會預設在第一句加上super();如果你是想在子類的建構函式中調用父類建構函式,則需要在子類的建構函式的函數體第一行(備註陳述式除外)使用:super(參數列表)的方式調用,該參數列表與父類有參建構函式聲明的參數列表一致,如果你不是在子類建構函式中調用,則無法直接調用父類建構函式,這時建立一個父類對象(通過你想調用的有參父類建構函式建立),就間接調用了該建構函式。
2 .如果父類只有有參數的建構函式,子類是否也無條件調用父類的有參建構函式呢?
子類可以無條件調用父類的無參數建構函式,如要調用有參數建構函式的話需要顯式調用,但如果子類中沒有顯式調用父類的建構函式時,會調用父類編譯器自動給加上的無參建構函式,你可以通過反編譯看到父類中多了一個無參的建構函式。如:class Child {public static void main(String args[]){System.out.println("this is father class");}Child(){System.out.println("ok...");}}public class Parent extends Child{Parent(String a,String b){//super();//不管加不加這句,子類都預設調用父類無參構造方法System.out.println("this is child mudi struct method");}public static void main(String args[]){System.out.println("this is child class");Parent p = new Parent("xx","xx");}}需要注意的是,java使用的都是控制代碼串連new對象的形式,並自動回收垃圾,而C++則是使用物件變數的形式,其建構函式在類對象定義時自動調用,賦值時調用拷貝構造
函數,而java只是複製一份控制代碼,對象沒有複製。
在java中,Parent p;表示未初始設定變數,不能使用。