1.在實例化子類時會默認調用子類的無參構造方法,但是在執行子類構造前,會首先自動實例化父類構造,先對父類的對
象實例化。
2.調用父類構造函數,可以用super()表示。
例子一
class A{
public A(){
System.out.println("*****************");
}
}
class B extends A{
public B(){
super();//表示由子類構造調用父類構造,加不加都可以
System.out.println("#################");
}
}
public class TestJava{
public static void main(String args[]){//static方法不用實例化類便可以調用
B b = new B();
}
}
//也就是證明,在子類的構造中其實一直隱藏着一行super()語句,但是在進行無參父類構造調用的時候
//寫上super()是沒有意義的,我們往往是在父類沒有提供無參構造的時候使用的。
例子二
class A{
public A(String name){
System.out.println("*****************");
}
}
class B extends A{
public B(String name){
super(name);
System.out.println("#################");
}
}
public class TestJava{
public static void main(String args[]){//static方法不用實例化類便可以調用
B b = new B("SMITH");
}
}
//所以在大部分情況下,出現super()往往是在需要調用父類有參構造的情況下,在大多數情況下父類一般
//都有無參構造方法,所以子類不會出現super(),而且對super()的調用必須是構造其的第一個語句。
例子三
class B extends A{
public B(String name){
System.out.println("#################");
super(name); //super()的調用必須是子類構造其的第一個語句
}
}
3.分析:關於super()與this()的問題。
之前學習過this(),表示調用本類的其他構造方法,而現在有了繼承關係以後,可以由super()調用父類中指定參數的構造函數。並且這兩個語句都一定要出現在首行(意味着不能同時出現這兩個語句)
//不讓子類的構造器裏面調用父類的構造方法,在子類的構造方法出現了this();這樣就不會出現super()的
//默認執行
class A{
public A(){
System.out.println("*****************");
}
}
class B extends A{
public B(){
this(ss);//這樣會導致循環沒有一個出口
};
public B(String name){
this();
System.out.println("#################");
}
}
public class TestJava{
public static void main(String args[]){//static方法不用實例化類便可以調用
B b = new B("SMITH");
}
}
4.總結:
(1)繼承的唯一好處就是進行了功能的擴充,並且Java只支持單繼承侷限
(2) 子類對象實例化時一定要先實例化父類對象,然後再實例化子類自己的對象(因爲子類實例化後需要使用父類的屬性,父類的屬性是在父類實例化後才能使用的。開闢堆棧內存空間。)