標籤:style class blog code java http
題一,如下代碼的執行結果:
class Person{ String name = "No name"; public Person(String nm){name = nm;} } class Employee extends Person{ String empID = "0000"; public Employee(String id){empID = id;} } class EmployeeTest{ public static void main(String[] args){ Employee e = new Employee("4321"); System.out.println(e.empID); } }
題二,如下代碼的執行結果:
class Atom{ Atom(){System.out.print("atom ");} } class Rock extends Atom{ Rock(String type){System.out.print(type);} } public class Mountain extends Rock{ Mountain(){ super("granite "); new Rock("granite "); } public static void main(String[] a){new Mountain();} }
題三,對如下代碼執行哪些調整,可以使Sub類正常執行:
1. class Super{ 2. private int a; 3. protected Super(int a){this.a = a;} 4. } ... 11. class Sub extends Super{ 12. public Sub(int a){super(a);} 13. public Sub(){this.a = 5;} 14. }
調整選項:
A. Change line 2 to: public int a; B. Change line 2 to: protected int a; C. Change line 13 to: public Sub(){this(5);} D. Change line 13 to: public Sub(){super(5);} E. Change line 13 to: public Sub(){super(a);}
這兩道題考察的重點是類的繼承,考點是父類構造器的調用。
關於父類構造器的調用需要注意以下幾點:
- 子類不會獲得父類的構造器;
- 在一個構造器中調用另一個重載的構造器可以使用this調用,在子類構造器中調用父類構造器可以使用super調用;
- 使用super調用父類構造器必須出現在子類構造器執行體的第一行;
- 不管是否使用super調用父類構造器,子類構造器總會調用父類構造器,調用形式有如下三種:
- 子類構造器使用super顯式調用父類構造器;
- 子類構造器使用this調用重載的構造器,重載的構造器調用父類構造器;
- 若子類構造器執行體中沒有super調用,也沒有this調用,系統將會在執行子類構造器前隱式調用父類的無參數構造器。
- 當調用子類構造器初始化子類對象時,父類構造器總會在子類構造器前執行。以此向上類推,建立任何java對象,最先執行的總是Object類的構造器;
- 如果沒有為一個類提供自訂構造器,系統會預設為這個類提供一個無參數構造器;反之,若已經為這個類提供了自訂構造器,系統將不會為這個類提供隱式無參構造器。
題目分析:題一中Person類沒有無參數構造器,子類Employee的構造器中也沒有使用super調用Person類中已定義的構造器,那麼子類將無法找到無參數的Person類構造器,無法編譯。
附上題一編譯結果:
根據以上的第五條可以推斷出題二的執行結果。
題二執行結果:
對於題三,先分析所給的代碼,著重關注Sub類的第二個構造器,這個構造器需要隱式調用父類的無參構造器。父類沒有提供無參構造器。因此需要為父類Super添加一個無參構造器,或調整Sub類的第二個構造器,使之調用Super類的有參數的構造器。答案中CD正確,E中調用的父類成員變數a的範圍錯誤。