亂七八糟的想法#
封裝、繼承哮塞、多態(tài)是面向?qū)ο笳Z言的重要特征刨秆。
封裝最重要的就是對外部隱藏一些不必要和不許修改的成員,而公開一些對外部有用的成員忆畅。Java中使用private來實現(xiàn)隱藏衡未。
繼承是父類經(jīng)過擴展生成一個子類,子類可能比父類具有更多的屬性家凯,java教材上說眠屎,子類將獲得父類的全部成員變量和方法,而不能獲得父類的構(gòu)造器肆饶,那么:
- 父類方法具有private訪問權(quán)限改衩,則方法對其子類是隱藏的,子類無法訪問該方法驯镊。這時有一個問題葫督,一個public權(quán)限的父類方法中調(diào)用了private權(quán)限的方法竭鞍,而這個public權(quán)限的方法被子類繼承,如果這時子類調(diào)用這個方法橄镜,那private權(quán)限的方法不是被執(zhí)行了嗎偎快?
- 父類一個成員變量具有private訪問權(quán)限, 那么這個變量對于子類也是隱藏的洽胶,子類無法訪問這個變量晒夹。但是,在創(chuàng)建子類對象時姊氓,系統(tǒng)會為這個成員變量創(chuàng)建存儲空間嗎丐怯?
小實驗:
class Superclass
{
private int a = 0;
public int b = 1;
protected int c = 2;
int d = 3;
public Superclass()
{
System.out.println("Superclass Constructor!!");
System.out.println(a+" "+b+" "+c+" "+d);
call();
}
private void test()//一個private方法
{
System.out.println("Private test!");
}
public void call()
{
System.out.println("Superclass Call!!");
this.test();
}
}
class Subclass extends Superclass
{
public int a = 3;
private int b = 2;
int c = 1;
protected int d = 3;
public Subclass()
{
System.out.println("Subclass Constructor!!");
}
public void call()
{
System.out.println("Subclass call");
super.call();
}
public void test()
{
System.out.println("Override??");
}
public static void main(String[] args)
{
Subclass test = new Subclass();
test.call();
}
}
運行結(jié)果:
Superclass Constructor!!
0 1 2 3
Subclass call
Superclass Call!!
Private test!
Subclass Constructor!!
Subclass call
Superclass Call!!
Private test!
- 這個java程序中,在父類Superclass中定義了一個私有方法test()翔横,子類中定義了一個公共方法test(),可以看到读跷,這時子類并沒有Override這個方法,所以在super()調(diào)用父類構(gòu)造器時禾唁,執(zhí)行的是父類中的私有方法效览,同樣,在call()方法中調(diào)用test()時荡短,執(zhí)行的同樣是父類中的私有方法丐枉。但這時,并不能說子類獲得了這個方法掘托,因為子類根本沒有權(quán)限訪問修改它瘦锹。
- 這時,如果將private方法改變?yōu)閜ublic權(quán)限烫映,這時運行結(jié)果變?yōu)椋?/li>
0 1 2 3
Subclass call
Superclass Call!!
Override??
Subclass Constructor!!
3 2 1 3
Subclass call
Superclass Call!!
Override??
此時沼本,父類的test()方法被子類Override,這時锭沟,在執(zhí)行super()和super.call()時抽兆,調(diào)用的是子類的test()方法。
- 同時族淮,父類的所有成員變量在子類對象被創(chuàng)建時辫红,均被分配了存儲空間,包括private權(quán)限的的變量祝辣,只是贴妻,這個變量不能被子類訪問,只能在父類方法中被訪問蝙斜,因此名惩,子類也并沒有獲得這個變量。
需要注意的問題#
- 關(guān)于繼承
- 方法Override時孕荠,子類方法的返回值類型應(yīng)比父類方法返回值類型更小或相等娩鹉,拋出異常應(yīng)比父類方法聲明拋出的異常類更小或相等攻谁,訪問權(quán)限應(yīng)比父類的大或相等,方法名和形參列表必須相同,覆蓋方法和被覆蓋方法應(yīng)同為類方法或者實例方法弯予。
- 子類不會獲得父類的構(gòu)造器戚宦,但子類構(gòu)造器會調(diào)用父類的構(gòu)造器,不論是否顯式的調(diào)用super()锈嫩,這樣一層層深入受楼,每個對象在創(chuàng)建時,都會調(diào)用Object類的構(gòu)造器呼寸。
3.父類中的方法被子類Override時艳汽,在父類中調(diào)用該方法時,會執(zhí)行子類中的覆蓋方法等舔,如上面的例子就是這種情況骚灸。