Part 1 抽象類和對象的上轉型對象
1、abstract方法只允許聲明不允許實現;
2、abstract類不能用new運算符創建對象;
3、若一個非抽象類是某個抽象類的子類,則它必須重寫父類的抽象方法並給出方法體(也可以繼承這個abstract方 法);
4、不允許abstract和final同時修飾一個方法(理由見上條)
5、abstract類中可以有abstract方法也可以沒有
總結:abstract類只關心操作(PS:只關心方法的名字、類型、參數),不關心操作實現的細節(PS:不關心方法體)
結合以上5條,我們可以從下面小代碼理解。
<span style="font-size:14px;">package fundamental;
/*
* 時間:1-4
* 內容:多態,上轉型對象,抽象
*/
//一個抽象類:花類
abstract class Flower {
void bloom(){
}
}
//兩個子類:玫瑰和百合
class Rose extends Flower{
void bloom(){
System.out.println("玫瑰花開放了!");
}
}
class Lily extends Flower{
void bloom(){
System.out.println("百合花開放了!");
}
}
public class Flower_Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Flower flower = new Rose();//flower是Rose的上轉型對象
flower.bloom();
flower = new Lily();////flower是Lily的上轉型對象
flower.bloom();
}
}</span>
運行結果:
玫瑰花開放了!
百合花開放了!
註釋:
1、啥是上轉型對象?
介個一開始我也理解困難,一句話:子類創建一個對象,並把這個對象的引用放到父類的對象中
(PS:對象的上轉型對象的實體是子類創建的,上轉型對象會失去原對象的一些屬性和功能,相當於子類對象的一個簡化對象)。
如:
<span style="font-size:14px;">Flower flower = new Rose();//flower是Rose的上轉型對象</span>
<span style="font-size:14px;">flower 實體 是子類Rose創建的,但是</span><span style="font-size:14px;">flower是父類Flower聲明的! </span><span style="font-size:14px;"></span>
2、abstract類到底有啥作用啊?
作用:是大大地提高了程序設計的效率!!由於它只關心操作不關心操作的具體實現細節,程序設計者可以把主要精力花在程序的設計上,不必拘泥細節的實現,框架設計出來後,具體的子類子類設計有子類設計者完成,就像做數學題時思路有了,具體過程慢慢算去吧。。
Part 1 多態性和對象的上轉型對象
多態性理解:父類的某個方法被其子類重寫時,可以各自產生自己的功能行爲
代碼如上(不復制了)。
簡單說明下,父類“花”的方法被子類“Rose” ,"Lily"重寫了,“Rose” 說”玫瑰花開放了!“,但是"Lily"說”百合花開放了!“,相同的方法bloom(),子類對象不同產生的行爲不同。(如果Lily說:玫瑰花開放了!——不是基因突變就是百合冒充玫瑰了)
這樣理解多態是不是具體多了。。
註釋:
1、用多態設計程序有啥好處呢?
可以體現程序設計所謂的開閉原則!!
介個做過項目的人都能深刻體會到,程序設計好後,首先應對abstract類的修改進行關閉,不然一旦修改abstract類
其所有子類都需要做出修改(有一次俺就這樣悲劇了!剛學Java那會,俺就是個小白癡)。
2、啥是開閉原則?
開閉原則強調一個程序應當對擴展開放,對修改關閉。(——一般結論都是抽象的,難理解的,這是結論的通病麼?)
PS:父類Flower有子類Rose ,Lily(百合) ,其他花也可以是它的子類比如鬱金香,牡丹,霸王花……這些花可以繼承父類Flower的方法(即對擴展開發),對修改關閉(見註釋1案例原因)。
總結:Well,well……我以後不想寫博文了,好累噻……
如果有錯別字啥的,呃,()
以上個人理解,如有不同的見解,一起討論下吧