JAVA類的繼承學習筆記——稻草人
學習資料:《Java就業培訓教程》
Java類繼承的特點
1.Java只支持單繼承,不允許多繼承,一個子類只能有一個父類,不允許一個類直接繼承多個類,但一個類可以被多個類繼承,,即是類X不可以既繼承類Y又繼承類Z。
2.可以有多繼承,如:類B繼承了類A,類C又可以繼承類B,那麼類C也間接繼承了類A。
3.子類繼承父類的所有成員變量和成員方法,但不繼承父類的構造方法(構造方法是特殊的成員方法,他與類名相同,不返回結果也不加void返回值)。
4.在子類的構造方法中可以使用super()調用父類的構造方法,如下:
public class Student extends Person
{
public Student(String name,int age,String school)
{
super(name,age);
this.school = school;
}
}
5.如果子類沒有顯式地調用父類構造方法,也沒有使用this關鍵字調用重載的其他構造方法,則在產生子類的實例對象時,系統默認調用父類無參數的構造方法。也就是,在下面的例子中,寫不寫super()語句效果是一樣的:
public class B extends A
{
public B ()
{
super();//寫不寫,效果時一樣的
}
}
如果子類構造方法沒有顯式地調用父類構造方法,二父類中又沒有無參數的構造方法(需要再次說明:如果父類沒有顯式地定義任何構造方法,系統將提供一個無參數的構造方法,相當於父類中又無參數的構造方法),則會編譯出錯。所以,通常情況下只要定義了有參數的構造方法,一般還要再定義一個無參數的構造方法。
/**
* 測試類的繼承特性
* @author Administrator
*
*/
class Person
{
public String name;
public int age;
public Person(String name,int age)
{
this.name = name;
this.age = age;
}
public Person() {}//如果這個構造函數不寫,則編譯會出錯
public void getInfo()
{
System.out.println("name:"+name+" , age"+age);
}
}
class Student extends Person{
public void study()
{
System.out.println("好好學習,天天向上");
}
public static void main(String arg[])
{
Person p = new Person();
p.name = "Person";
p.age = 33;
p.getInfo();
Student s = new Student();
s.name = "student";
s.age = 10;
s.getInfo();
s.study();
}
}
子類對象實例化過程
1.分配成員變量的存儲空間,並進行默認的初始化,就是用new關鍵字產生對象以後,對成員變量用相應的關係對對象中的成員變量進行初始化賦值。
2.綁定構造參數。
3.如果有this()調用,則調用相應的重載構造方法,(被調用的衝在構造方法又從步驟2開始執行這些流程),被調用的重載構造方法結束後回到當前的構造方法,然後直接跳到步驟6執行。
4.顯式或隱式追溯調用父類的構造方法(一直到Object類爲止,Object是所有Java類的最頂層父類),父類的構造方法又從步驟2開始對父類執行這些流程,父類構造方法執行結束後,回到當前的構造方法,當前構造方法繼續往下執行。
5.進行實例變量的顯式初始化,也就是執行在定義成員變量時就對其進行賦值的語句。String school = "NIT";
6.執行當前構造方法的方法體裏面的程序代碼。
覆蓋父類的方法
*覆蓋的方法必須和被覆蓋的方法具有相同的方法名稱,參數列表和返回值類型。
*覆蓋方法時,不能使用比父類中被覆蓋的方法更加嚴格的訪問權限。