1. 程式人生 > 其它 >Java抽象類(abstract)

Java抽象類(abstract)

抽象類和介面

一、抽象類

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 使用方向

  • 關注一個事物的本質的時候,用抽象類;

  • 關注一個操作的時候,用介面。

小結

抽象類的功能要遠超過介面,但是,定義抽象類的代價高。因為高階語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然介面在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個介面。在設計階段會降低難度的。

本文來自部落格園,作者:致非,轉載請註明原文連結:https://www.cnblogs.com/mycity/p/abstract.html