內(nèi)容來之 極客學(xué)院 和 毛毛蟲的小哈
將子類轉(zhuǎn)換成父類琳彩,在繼承關(guān)系上面是向上移動(dòng)的誊酌,所以一般稱之為向上轉(zhuǎn)型。由于向上轉(zhuǎn)型是從一個(gè)叫專用類型向較通用類型轉(zhuǎn)換露乏,所以它總是安全的碧浊,唯一發(fā)生變化的可能就是屬性和方法的丟失。這就是為什么編譯器在“未曾明確表示轉(zhuǎn)型”活“未曾指定特殊標(biāo)記”的情況下瘟仿,仍然允許向上轉(zhuǎn)型的原因箱锐。
謹(jǐn)慎繼承
上面講了繼承所帶來的諸多好處,那我們是不是就可以大肆地使用繼承呢劳较?送你一句話:慎用繼承驹止。
首先我們需要明確浩聋,繼承存在如下缺陷:
1、父類變臊恋,子類就必須變衣洁。
2、繼承破壞了封裝抖仅,對(duì)于父類而言坊夫,它的實(shí)現(xiàn)細(xì)節(jié)對(duì)與子類來說都是透明的。
3撤卢、繼承是一種強(qiáng)耦合關(guān)系环凿。
所以說當(dāng)我們使用繼承的時(shí)候,我們需要確信使用繼承確實(shí)是有效可行的辦法放吩。那么到底要不要使用繼承呢智听?《Think in Java》中提供了解決辦法:問一問自己是否需要從子類向父類進(jìn)行向上轉(zhuǎn)型。如果必須向上轉(zhuǎn)型渡紫,則繼承是必要的到推,但是如果不需要,則應(yīng)當(dāng)好好考慮自己是否需要繼承腻惠。
例子 :
package com.sheepmu;
class Animal
{
public void eat()
{
System.out.println("父類的 eating...");
}
}
class Bird extends Animal
{
@Override
public void eat()
{
System.out.println("子類重寫的父類的 eatting...");
}
public void fly()
{
System.out.println("子類新方法 flying...");
}
}
public class Sys
{
public static void main(String[] args)
{
Animal b=new Bird(); //向上轉(zhuǎn)型
b.eat();
// b.fly(); b雖指向子類對(duì)象环肘,但此時(shí)子類作為向上的代價(jià)丟失和父類不同的fly()方法
sleep(new Male());
sleep(new Female());//傳入的參數(shù)是子類-----!集灌!
}
public static void sleep(Human h) //方法的參數(shù)是父類------;诒ⅰ!欣喧!
{
h.sleep();
}
}
[java] view plain copy
package com.sheepmu;
public class Human
{
public void sleep()
{
System.out.println("父類人類 sleep..");
}
}
class Male extends Human
{
@Override
public void sleep()
{
System.out.println("男人 sleep..");
}
}
class Female extends Human
{
@Override
public void sleep()
{
System.out.println("女人 sleep..");
}
}
輸出:
子類重寫的父類的 eatting...男人 sleep..女人 sleep..
詳解:
- 向上轉(zhuǎn)型的實(shí)現(xiàn) ** **
Animal b=new Bird(); //向上轉(zhuǎn)型 b.eat(); // 調(diào)用的是子類的eat()方法 b.fly(); // 報(bào)錯(cuò)!!!!!-------b雖指向子類對(duì)象腌零,但此時(shí)子類作為向上轉(zhuǎn)型的代價(jià)丟失和父類不同的fly()方法------2.為何不直接Bird b=new Bird();b.eat() 呢?
這樣就沒有體現(xiàn)出面向?qū)ο蟮某橄蟮木幊趟枷胙剿舭ⅲ档土舜a的可擴(kuò)展性.
3.向上轉(zhuǎn)型的好處益涧?
sleep(new Male());//調(diào)用方法時(shí)傳入的參數(shù)是子類 sleep(new Female());
** public static void sleep(Human h) //方法的參數(shù)是父類**
{
h.sleep();
}
如上代碼就是用的向上轉(zhuǎn)型,若是不用向上轉(zhuǎn)型驯鳖,那么有多少個(gè)子類就得在這兒寫多少種不同的睡覺方法~~~~~~
如果 你的所有的子類要 轉(zhuǎn)換成父類 , 并都調(diào)用重寫的方法 ,那么就可以繼承.
(可以嘗試細(xì)分繼承,類似接口隔離原則 自己理解)