Java 抽象類(lèi)

在面向?qū)ο蟮母拍钪幸呗械膶?duì)象都是通過(guò)類(lèi)來(lái)描繪的滚躯,但是反過(guò)來(lái),并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,如果一個(gè)類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象靴患,這樣的類(lèi)就是抽象類(lèi)。
抽象類(lèi)除了不能實(shí)例化對(duì)象之外况脆,類(lèi)的其它功能依然存在看铆,成員變量悄但、成員方法和構(gòu)造方法的訪問(wèn)方式和普通類(lèi)一樣助泽。
由于抽象類(lèi)不能實(shí)例化對(duì)象诫睬,所以抽象類(lèi)必須被繼承,才能被使用。也是因?yàn)檫@個(gè)原因,通常在設(shè)計(jì)階段決定要不要設(shè)計(jì)抽象類(lèi)。
父類(lèi)包含了子類(lèi)集合的常見(jiàn)的方法,但是由于父類(lèi)本身是抽象的,所以不能使用這些方法。
在Java中抽象類(lèi)表示的是一種繼承關(guān)系,一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi)锡垄,而一個(gè)類(lèi)卻可以實(shí)現(xiàn)多個(gè)接口。

抽象類(lèi)

在Java語(yǔ)言中使用abstract class來(lái)定義抽象類(lèi)。如下實(shí)例:

public abstract class Employee {
  private String name;
  private String address;
  private int number;

  public Employee(String name, String address, int number) {
    System.out.println("Constructing an Employee");
    this.name = name;
    this.address = address;
    this.number = number;
  }

  public double computePay() {
    System.out.println("Inside Employee computePay");
    return 0.0;
  }

  public void mailCheck() {
    System.out.println("Mailing a check to " + this.name + " " + this.address);
  }

  public String toString() {
    return name + " " + address + " " + number;
  }

  public String getName() {
    return name;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String newAddress) {
    address = newAddress;
  }

  public int getNumber() {
    return number;
  }
}

注意到該 Employee 類(lèi)沒(méi)有什么不同距境,盡管該類(lèi)是抽象類(lèi),但是它仍然有 3 個(gè)成員變量后控,7 個(gè)成員方法和 1 個(gè)構(gòu)造方法张抄。 現(xiàn)在如果你嘗試如下的例子:

public class AbstractDemo
{
   public static void main(String [] args)
   {
      /* 以下是不允許的泽台,會(huì)引發(fā)錯(cuò)誤 */
      Employee e = new Employee("George W.", "Houston, TX", 43);
 
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

編譯的時(shí)候報(bào)錯(cuò):

AbstractDemo.java:4: 錯(cuò)誤: Employee是抽象的; 無(wú)法實(shí)例化
   Employee e = new Employee("George W.", "Houston, TX", 43);                 ^
1 個(gè)錯(cuò)誤

繼承抽象類(lèi)

我們能通過(guò)一般的方法繼承Employee類(lèi):

public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

盡管我們不能實(shí)例化一個(gè) Employee 類(lèi)的對(duì)象样眠,但是如果我們實(shí)例化一個(gè) Salary 類(lèi)對(duì)象辫秧,該對(duì)象將從 Employee 類(lèi)繼承 7 個(gè)成員方法,且通過(guò)該方法可以設(shè)置或獲取三個(gè)成員變量。

public class AbstractTestDemo {
  public static void main(String[] args) {
    Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
    Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

    System.out.println("Call mailCheck using Salary reference --");
    s.mailCheck();

    System.out.println("\n Call mailCheck using Employee reference--");
    e.mailCheck();
  }
}

編譯后的結(jié)果為:

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class 
Mailing check to Mohd Mohtashim with salary 3600.0
Call mailCheck using Employee reference--
Within mailCheck of Salary class 
Mailing check to John Adams with salary 2400.0

抽象方法

如果你想設(shè)計(jì)這樣一個(gè)類(lèi)植旧,該類(lèi)包含一個(gè)特別的成員方法听皿,該方法的具體實(shí)現(xiàn)由它的子類(lèi)確定尉姨,那么你可以在父類(lèi)中聲明該方法為抽象方法。
Abstract 關(guān)鍵字同樣可以用來(lái)聲明抽象方法吗冤,抽象方法只包含一個(gè)方法名又厉,而沒(méi)有方法體。
抽象方法沒(méi)有定義椎瘟,方法名后面直接跟一個(gè)分號(hào)覆致,而不是花括號(hào)。

public abstract class EmployeTest {
  private String name;
  private String address;
  private int number;

  public abstract double computePay();

  // 其余代碼
}

聲明抽象方法會(huì)造成以下兩個(gè)結(jié)果:

  • 如果一個(gè)類(lèi)包含抽象方法肺蔚,那么該類(lèi)必須是抽象類(lèi)煌妈。
  • 任何子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法,或者聲明自身為抽象類(lèi)宣羊。

繼承抽象方法的子類(lèi)必須重寫(xiě)該方法璧诵。否則,該子類(lèi)也必須聲明為抽象類(lèi)段只。最終,必須有子類(lèi)實(shí)現(xiàn)該抽象方法鉴扫,否則赞枕,從最初的父類(lèi)到最終的子類(lèi)都不能用來(lái)實(shí)例化對(duì)象。
如果SalaryTest類(lèi)繼承了EmployeeTest類(lèi),那么它必須實(shí)現(xiàn)computePay()方法:

public class SalaryTest extends EmployeTest {
  private double salary; // Annual salary

  public double computePay() {
    System.out.println("Computing salary pay for " + getName());
    return salary / 52;
  }

  // 其余代碼
}

抽象類(lèi)總結(jié)規(guī)定

  1. 抽象類(lèi)不能被實(shí)例化(初學(xué)者很容易犯的錯(cuò))炕婶,如果被實(shí)例化姐赡,就會(huì)報(bào)錯(cuò),編譯無(wú)法通過(guò)柠掂。只有抽象類(lèi)的非抽象子類(lèi)可以創(chuàng)建對(duì)象项滑。
  2. 抽象類(lèi)中不一定包含抽象方法,但是有抽象方法的類(lèi)必定是抽象類(lèi)涯贞。
  3. 抽象類(lèi)中的抽象方法只是聲明枪狂,不包含方法體,就是不給出方法的具體實(shí)現(xiàn)也就是方法的具體功能宋渔。
  4. 構(gòu)造方法州疾,類(lèi)方法(用 static 修飾的方法)不能聲明為抽象方法。
  5. 抽象類(lèi)的子類(lèi)必須給出抽象類(lèi)中的抽象方法的具體實(shí)現(xiàn)皇拣,除非該子類(lèi)也是抽象類(lèi)严蓖。

這個(gè)類(lèi)似于iOS中OC的代理方法,不同的是代理方法被繼承之后還是代理方法氧急。而Java中的這個(gè)抽象類(lèi) 被繼承后只要實(shí)現(xiàn)了抽象方法就可以了颗胡。類(lèi)還是單獨(dú)的類(lèi)唯一和抽象類(lèi)相關(guān)的也就是抽象方法了。

源地址:Java 抽象類(lèi)
github地址:Java學(xué)習(xí)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吩坝,一起剝皮案震驚了整個(gè)濱河市毒姨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钾恢,老刑警劉巖手素,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘩蚪,居然都是意外死亡泉懦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)疹瘦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崩哩,“玉大人,你說(shuō)我怎么就攤上這事言沐〉肃冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵险胰,是天一觀的道長(zhǎng)汹押。 經(jīng)常有香客問(wèn)我,道長(zhǎng)起便,這世上最難降的妖魔是什么棚贾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任窖维,我火速辦了婚禮,結(jié)果婚禮上妙痹,老公的妹妹穿的比我還像新娘铸史。我一直安慰自己,他們只是感情好怯伊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布琳轿。 她就那樣靜靜地躺著,像睡著了一般耿芹。 火紅的嫁衣襯著肌膚如雪崭篡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天猩系,我揣著相機(jī)與錄音媚送,去河邊找鬼。 笑死寇甸,一個(gè)胖子當(dāng)著我的面吹牛塘偎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拿霉,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吟秩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绽淘?” 一聲冷哼從身側(cè)響起涵防,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沪铭,沒(méi)想到半個(gè)月后壮池,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杀怠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年椰憋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赔退。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橙依,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硕旗,到底是詐尸還是另有隱情窗骑,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布漆枚,位于F島的核電站创译,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墙基。R本人自食惡果不足惜软族,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一辛藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧互订,春花似錦、人聲如沸痘拆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纺蛆。三九已至吐葵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桥氏,已是汗流浹背温峭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留字支,地道東北人凤藏。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像堕伪,于是被迫代替她去往敵國(guó)和親揖庄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 接口和內(nèi)部類(lèi)為我們提供了一種將接口與實(shí)現(xiàn)分離的更加結(jié)構(gòu)化的方法欠雌。 抽象類(lèi)我們都知道在面向?qū)ο蟮念I(lǐng)域一切都是對(duì)象蹄梢,同...
    JaedenKil閱讀 323評(píng)論 0 1
  • Java抽象類(lèi) 在面向?qū)ο蟮母拍钪校械膶?duì)象都是通過(guò)類(lèi)來(lái)描繪的富俄,但是反過(guò)來(lái)禁炒,并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,如...
    YQY_苑閱讀 346評(píng)論 0 0
  • #都挺好##最強(qiáng)淚點(diǎn)#蘇大強(qiáng)失蹤凹蜂,蘇明玉怒撕練習(xí)冊(cè)。原來(lái)蘇大強(qiáng)瞞著蘇母偷藏了半年私房錢(qián)阁危,是為了給明玉買(mǎi)考試練習(xí)冊(cè)玛痊。...
    沉蔓閱讀 158評(píng)論 0 0
  • 安心地閱讀 229評(píng)論 0 2
  • 蘋(píng)果,開(kāi)啟了亞當(dāng)狂打,夏娃的智慧擂煞。 蘋(píng)果,啟發(fā)了牛頓的深思趴乡。 象征靈感的蘋(píng)果对省,凝結(jié)成咖啡蝗拿。滴落在象征人類(lèi)智慧的魔方上。...
    蘇子挽安閱讀 577評(píng)論 0 1