Java初探:抽象(Abstract)之簡單示範

抽象(Abstract)與介面的地位差不多,都是將一件事物的本質、行為抽取出來定義,並試圖將事物專屬的輪廓排除,我知道這樣說起來很難懂,但這本來就是抽象讓人家很難理解之處,試問,每個人都看得懂抽象派的畫作嗎?抽象對比介面,最大的差異點就是它可以在方法中定義相關的程序(程式碼)。

抽象之基本說明

  1. 抽象類別與介面一樣,不可以被實例化(instance)。
  2. 抽象類別比介面更慘的是,連被實作(implements)都不行。
  3. 抽象類別可以繼承(extends)多個抽象類別。
  4. 抽象類別可以有建構子。
  5. 抽象類別不一定要有抽象方法,但一個類別中如果存在著抽象方法,那它一定要被宣告成抽象類別。

以下將抽象(Abstract)與介面(Interface)混用,用遊戲來當作例子(舉例不是很好,但是重點在觀念與撰寫方式),程式碼如下:

先創造出一個會員抽象類別,其中的getMember()方法,因為我們不知道在每一個extends的類別要怎麼表示這些會員,因此我們在這邊把它定義成抽象方法,其餘的資料成員以及方法,都不是抽象方法,也因為不是抽象,所以可以擁有自己的程式碼(body)。此外,抽象類別是允許有建構子的,因此我們可以看到有一個空建構子,叫做Member()。程式碼如下:

public abstract class Member
{
  public java.util.ArrayList<String> oList;
  //建構子
  public Member()
  {
    oList = new java.util.ArrayList<String>();
  }
  //新增遊戲成員
  public void add(String cName)
  {
    oList.add(cName);
  }
  //抽象方法(取出所有成員)
  public abstract void getMember();
}

再創造一個名為Game的介面,由於遊戲有很多種,但規矩主要都是遊戲開始、遊戲中、遊戲結束,因此我們將程式碼撰寫如下:

public interface Game
{
  //所有介面的資料成員,一定是常數,這個常數可以再實作時期直接引用,或進行複寫(Overriding)。
  public String cGameName = "Undefined";
  //定義遊戲應該要具備的方法
  public void Start();
  public void Process();
  public void End();
}

在主控程式這邊,GameConsole繼承了Member並實作了Game,把相關應該複寫的方法或資料寫好後,就可以開開心心的操作這些物件啦!

public class GameConsole extends Member implements Game
{
  //Extends Member.java
  public void getMember()  //繼承getMember並將其複寫(Overriding)
  {
    for(String cTemp : oList)
    {
      System.out.println("Game Member: " + cTemp);
    }
  }
  
  //Implement Game.java
  public String cGameName;  //複寫(Overriding)cGameName
  public void Start()
  {
    System.out.println(cGameName + " START");
  }
  public void Process()
  { 
    getMember();
    System.out.println(cGameName + " Gaming...");
  }
  public void End()
  {
    System.out.println(cGameName + " End");
  }

  public static void main(String[] args)
  {
    GameConsole oTemp = new GameConsole();
    oTemp.cGameName = "OOXX";
    oTemp.add("John");
    oTemp.add("Mary");
    oTemp.Start();
    oTemp.Process();
    oTemp.End();
  }
}

輸出結果如下:

C:\Java>java GameConsole
OOXX START
Game Member: John
Game Member: Mary
OOXX Gaming...
OOXX End
Java SCJP Abstract Interface Extends Implements