一、抽象類
1、什么是抽象類?
類和類之間具有共同的特征,將這些特征提取出來,形成的就是抽象類。 類到對象是實例化,對象到類是抽象。
-
抽象類和具體類是相對的概念。“抽象”是一種存在思想邏輯中的概念,而“具體”是一種可見可觸摸的現實對象。簡單說,比如“人”比“男人”抽象一點,“動物”又比“人”更抽象一點,而“生物”又比“動物”更抽象。
-
抽象的概念是由具體概念依其“共性”而產生的,把具體概念的諸多個性排出,集中描述其共性,就會產生一個抽象性的概念。抽象思維,是人類思維達到高級階段產生的一種能力,例如,當小孩子思維尚未成熟時,他們只能掌握具體概念,他們在學習代詞“你、我、他”時往往遇到困難,因為代詞具有較高的抽象性。
-
總之,抽象概念的外延大,內涵小;具體概念的外延小,內涵大。
1.1 抽象類與普通類
-
(1)普通類可以去實例化調用;抽象類不能被實例化,因為它是存在於一種概念而不非具體。
-
(2)普通類和抽象類都可以被繼承,但是抽象類被繼承后子類必須重寫繼承的方法,除非自類也是抽象類。
-
(2)實例應用:
package com.q._abstract;
public class Person {
protected int id;
protected String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public void print(){
System.out.println("這是一個人");
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
class Student extends Person{
private double score;
public Student(int id, String name,double score) {
super(id, name);
this.score = score;
}
@Override
public void print(){
System.out.println("這是一個學生");
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", score=" + score +
'}';
}
}
class Test{
public static void main(String[] args) {
Person person = new Person(1,"person");
Student student = new Student(1,"student",100);
System.out.println(person);
person.print();
System.out.println("---------------");
System.out.println(student);
student.print();
}
}
疑問
問:
把父類改成抽象類,方法改成抽象方法,那么public void play(); 子類不變,依然重寫父類方法,那這個跟普通父類沒區別啊?難道說就一個抽象方法沒方法體就完事了??那我普通方法有方法體,我空着不寫內容不就得了,不跟抽象方法一個樣嗎??別跟我說抽象類還不能實例化,哥也不需要去new它!普通類都能搞定的,還弄個抽象類有什么意義?我前面都說了普通類的方法我可以空着不寫,達到跟抽象類方法沒方法體一樣的效果。既然兩種方式都能達到同一個輸出效果,弄一種方式不就得了,那為什么還要創造出一個抽象類出來?難道是比普通類看着舒服?用着爽?還是更加便捷?還是為了強制讓別人用的時候必須強制化實現抽象方法省的你忘了什么的?
答:
就是為了強制不能實例化,以及強制子類必須實現方法這不是你忘不忘的問題,你說你不去new它就行了,這話沒錯 那你想另一個問題,為什么要有訪問控制呢?為什么要有private和public之分呢?我可以全部public,不該訪問的,我不訪問就行了啊?小程序里,看不出什么區別,反而private成員要寫一堆set和get函數,多麻煩,我自己寫小程序的時候也會偷懶全部public,但是項目大了,代碼多了,這種嚴謹的結構就很重要了。且不說會有很多人合作一起寫一個程序,哪怕還是你一個人寫,也保不住有忘記的時候,那時候編譯器不報錯,茫茫碼海上哪找錯誤去面向對象說到底就是方便你思考,易擴展、易維護管理,硬要說沒必要,整個面向對象都沒必要了,C語言有什么干不了的呀,運行效率還高。
2、抽象類屬於什么類型?
抽象類屬於引用數據類型
3、抽象類的定義。
class abstract 類名{}
4、抽象類與接口
4.1概念
接口動作的抽象,抽象類是對本質的抽象。 抽象類需子類繼承實現,接口可以實現多個
-
類表示的是,這個對象是什么。
-
表示的是,這個對象能做什么。
-
比如,男人和女人,他們的抽象類是人類,而貓和狗的抽象類是寵物類。人類可以吃東西,寵物類也可以吃東西,但是兩者不能混為一談,因為有本質的區別。
-
這個“吃東西”是一個動作,你可以把“吃東西”定義成一個接口,然后讓兩個類去實現它的方法。
,在高級語言上,一個類只能繼承一個類或抽象類,正如人不可能同時是動物類又是植物類,但是可以實現多個接口,例如,吃飯接口、呼吸接口等。
4.2使用情況
-
抽象類 和 接口 都是用來抽象具體對象的,但是接口的抽象級別最高;
-
抽象類可以有具體的方法和屬性, 接口只能有抽象方法和不可變常量(final);
-
抽象類主要用來抽象類別,接口主要用來抽象功能;
-
抽象類中不包含任何實現,派生類必須覆蓋它們。接口中所有方法都必須是未實現的;
-
抽象類實現接口時,接口的方法在抽象類中可以被實現也可以不被實現,而普通實現接口必須實現所有接口方法。
4.3 使用方向
-
關注一個事物的本質的時候,用抽象類;
-
關注一個操作的時候,用接口。
小結
抽象類的功能要遠超過接口,但是,定義抽象類的代價高。因為高級語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然接口在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個接口。在設計階段會降低難度的。