Java 抽象類

Java 抽象類

面向?qū)ο蟮某绦蛟O(shè)計中姓惑,所有的對象都是通過類來描繪的未状,但是反過來闰蚕,并不是所有的類都是用來描繪對象的排抬,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是 抽象類

抽象類除了不能實例化對象之外授段,類的其它功能依然存在蹲蒲,成員變量、成員方法和構(gòu)造方法的訪問方式和普通類一樣

由于抽象類不能實例化對象侵贵,所以抽象類必須被繼承届搁,才能被使用,也是因為這個原因窍育,通常在設(shè)計階段決定要不要設(shè)計抽象類

父類包含了子類集合的常見的方法卡睦,但是由于父類本身是抽象的,所以不能使用這些方法

Java 中抽象類表示的是一種繼承關(guān)系漱抓,一個類只能繼承一個抽象類表锻,而一個類卻可以實現(xiàn)多個接口

抽象類

Java 使用 abstract class 語句來定義抽象類

Employee.java

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 類與普通類沒有什么不同,盡管該類是抽象類乞娄,但是它仍然有 3 個成員變量瞬逊,7 個成員方法和 1 個構(gòu)造方法

然后我們就可以寫一個類來實現(xiàn)該抽象類

AbstractDemo.java

public class AbstractDemo
{
   public static void main(String [] args)
   {
      /* 以下是不允許的,會引發(fā)錯誤 */
      Employee e = new Employee("George W.", "Houston, TX", 43);

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

當(dāng)你嘗試編譯AbstractDemo類時仪或,會產(chǎn)生如下錯誤:

Employee.java:46: Employee is abstract; cannot be instantiated
Employee e = new Employee("George W.", "Houston, TX", 43);
^
1 error

繼承抽象類

抽象類還可以被繼承码耐,繼承的語法和普通類的繼承一樣都是使用 extends 關(guān)鍵字

Salary.java

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;
   }
}

抽象類不能被實例化,比如不能實例化一個 Employee 類的對象

但如果繼承類實現(xiàn)了抽象類的所有方法溶其,那么繼承類就可以被實例化骚腥,比如可以實例化一個 Salary 類對象,該對象將從 Employee 類繼承 7 個成員方法瓶逃,且通過該方法可以設(shè)置或獲取三個成員變量

最后束铭,我們可以寫一個測試類 AbstractDemo 使用剛剛定義的 Salary 類

public class AbstractDemo
{
   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();
    }
}

編譯運行以上 Java 代碼,輸出結(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.
</pre>

抽象方法

有時候你可能想要設(shè)計這樣一個類厢绝,該類包含一個特別的成員方法契沫,該方法的具體實現(xiàn)由它的子類確定,那么你可以在父類中聲明該方法為抽象方法

abstract 關(guān)鍵字同樣可以用來聲明抽象方法昔汉,抽象方法只包含一個方法名懈万,而沒有方法體

抽象方法沒有定義,方法名后面直接跟一個分號靶病,而不是花括號

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

   public abstract double computePay();

   //其余代碼
}

聲明抽象方法會造成以下兩個結(jié)果

  1. 如果一個類包含抽象方法会通,那么該類必須是抽象類
  2. 任何子類必須重寫父類的抽象方法,或者聲明自身為抽象類

繼承抽象方法的子類必須重寫該方法娄周,否則涕侈,該子類也必須聲明為抽象類

最終,必須有子類實現(xiàn)該抽象方法煤辨,否則裳涛,從最初的父類到最終的子類都不能用來實例化對象

如果 Salary 類繼承了 Employee 類木张,那么它必須實現(xiàn) computePay() 方法

Salary.java

public class Salary extends Employee
{
   private double salary; // Annual salary

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

   //其余代碼
}

抽象類的幾點約束

  1. 抽象類不能被實例化 ( 初學(xué)者很容易犯的錯 ),如果被實例化端三,就會報錯舷礼,編譯無法通過,只有抽象類的非抽象子類可以創(chuàng)建對象

  2. 抽象類中不一定包含抽象方法郊闯,但是有抽象方法的類必定是抽象類

  3. 抽象類中的抽象方法只是聲明且轨,不包含方法體,就是不給出方法的具體實現(xiàn)也就是方法的具體功能

  4. 構(gòu)造方法虚婿,類方法 ( 用 static 修飾的方法 ) 不能聲明為抽象方法

  5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn)旋奢,除非該子類也是抽象類

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市然痊,隨后出現(xiàn)的幾起案子至朗,更是在濱河造成了極大的恐慌,老刑警劉巖剧浸,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锹引,死亡現(xiàn)場離奇詭異,居然都是意外死亡唆香,警方通過查閱死者的電腦和手機嫌变,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躬它,“玉大人腾啥,你說我怎么就攤上這事》胂牛” “怎么了倘待?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長组贺。 經(jīng)常有香客問我凸舵,道長,這世上最難降的妖魔是什么失尖? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任啊奄,我火速辦了婚禮,結(jié)果婚禮上掀潮,老公的妹妹穿的比我還像新娘菇夸。我一直安慰自己,他們只是感情好胧辽,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布峻仇。 她就那樣靜靜地躺著公黑,像睡著了一般邑商。 火紅的嫁衣襯著肌膚如雪摄咆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天人断,我揣著相機與錄音吭从,去河邊找鬼。 笑死恶迈,一個胖子當(dāng)著我的面吹牛涩金,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暇仲,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼步做,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奈附?” 一聲冷哼從身側(cè)響起全度,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斥滤,沒想到半個月后将鸵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡佑颇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年顶掉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挑胸。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡痒筒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茬贵,到底是詐尸還是另有隱情凸克,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布闷沥,位于F島的核電站萎战,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舆逃。R本人自食惡果不足惜蚂维,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望路狮。 院中可真熱鬧虫啥,春花似錦、人聲如沸奄妨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸抛。三九已至评雌,卻和暖如春树枫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背景东。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工砂轻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斤吐。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓搔涝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親和措。 傳聞我的和親對象是個殘疾皇子庄呈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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