OOP: 理解類和物件(1) (轉)

worldblog發表於2007-12-09
OOP: 理解類和物件(1) (轉)[@more@]: 理解類和(1)

[ 作者: 不詳   新增時間: 2001-9-7 8:10:45 ]


來源:

上一次在"使用開始物件導向的"這篇文章中,我們學習了一個程式語言要真正成為物件導向的,它應該支援資訊隱藏/封裝,多型,繼承和動態繫結.另外,我們知道了Java完全支援這些功能,而且知道了因為Java是一種解釋性的語言並執行在虛擬機器的內部,所以由Java寫成的任何都可以在任何支援 Java虛擬機器(JVM)的操作上執行.我們還明白了物件是代表現實生活中事物的-程式設計模型以及物件是由它們的狀態和行為定義的.最後,我們知道了Java中除了原始資料物件以外一切都是物件.

因為這種風格中的這許多內容都和物件以及類有關,我們將在下面進一步的考察它們.

物件詳論
使用物件的一個關鍵是當你在瀏覽系統分析文件或者設計文件的時候如何來確定它們.因為物件一般代表人,地方或者事物,所以一個確定物件的基本的方法就是找出句子中所使用的名詞.這裡有一個簡單的例子.在句子"一個顧客可以擁有多於一個的銀行帳號",我們就確定了兩個物件,客戶和帳號.在句子"小貓喵喵叫"中,我們能夠確定一個物件,貓.

類詳論
前面,我們學習了一個類是定義了物件如何動作以及當物件建立或者說例項化的時候應該包含些什麼的實體.在對動物的討論中,我們可以說,"狗兒汪汪叫,貓喵喵叫,鴨子嘎嘎叫."確定句子中的物件我們就得到了狗,貓和鴨子.至於汪汪叫,喵喵叫,嘎嘎叫,那都是我們物件發出的行為動作.

要實現這些物件,我們需要建立三個物件分別叫Dog,Cat和Duck.要實現它們的行為,我們可以為每一個這些物件建立代表每個物件發出的的方法,而且我們把這個方法叫做speak或者,如果我們發揮想象力的話還可以把這個方法叫做sayHello.

在程式的上下文中為了演示這些概念,讓我們修改上篇文章中的HelloWorld程式,新增這三個新物件並給它們中的每一個新增sayHello方法,如下所示:

public class HelloWorld
{
   public static void main(String[] args)
   {
       Dog animal1 = new Dog();
       Cat animal2 = new Cat();
       Duck animal3 = new Duck();
       animal1.sayHello();
       animal2.sayHello();
       animal3.sayHello();
   }
}

class Dog
{
   public void sayHello()
   {
       System.out.println("Bark");
   }
}

class Cat
{
   public void sayHello()
   {
       System.out.println("Meow");
   }
}

class Duck
{
   public void sayHello()
   {
       System.out.println("Quack");
   }
}

在編譯並執行了這個程式以後,輸出應該如下:
Bark
Meow
Quack

看看我們的程式,我們馬上就注意到了一些事情:每個物件代表了一種動物,而每個物件實現了一個相同的方法,sayHello.假設我們想要給物件更多的功能以及用來代表物件所指的動物的方法和屬性.比方說,我們可以新增一個方法來確定一個動物是不是哺乳類的,或者我們新增一個方法來確定一個動物是不是肉食性的.我們可以透過給每一個物件新增這兩種方法來實現或者我們也能夠使用OOP的兩個最強大的功能:繼承和多型.

因為所有的物件都代表一個物件,所以我們將建立一個被稱為"基類"或是"超類"的類,它的名字是Animal.我們然後可以讓我們的物件從Animal類繼承相同的特點並強制每個物件只實現與Animal類不同的功能.

Java用extends關鍵字指明一個類從另一個繼承.讓我們利用繼承和多型的概念獲得程式碼重用的好處來重建我們的程式並使得每個物件只實現與基類Animal不同的功能:

public class HelloWorld
{
   public static void main(String[] args)
   {
       Dog animal1 = new Dog();
       Cat animal2 = new Cat();
       Duck animal3 = new Duck();
       System.out.println("A dog says " +animal1.getHello()
       +", is carnivorous: " +animal1.isCarnivorous()
       +", is a mammal: " +animal1.isAMammal());

       System.out.println("A cat says " +animal2.getHello()
       +", is carnivorous: " +animal2.isCarnivorous()
       +", is a mammal: " +animal2.isAMammal());

       System.out.println("A duck says " +animal3.getHello()
       +", is carnivorous: " +animal3.isCarnivorous()
       +", is a mammal: " +animal3.isAMammal());
   }
}

abstract class Animal
{
   public boolean isAMammal()
   {
       return(true);
   }

   public boolean isCarnivorous()
   {
       return(true);
   }

   abstract public String getHello();
}

class Dog extends Animal
{
   public String getHello()
   {
       return("Bark");
   }
}

class Cat extends Animal
{
   public String getHello()
   {
       return("Meow");
   }
}

class Duck extends Animal

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990128/,如需轉載,請註明出處,否則將追究法律責任。

相關文章