国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

面向?qū)ο笏枷胫?-理解類和對象

2019-11-18 11:17:57
字體:
供稿:網(wǎng)友

  上一次在"使用java開始面向?qū)ο蟮木幊?這篇文章中,我們學(xué)習(xí)了一個編程語言要真正成為面向?qū)ο蟮?它應(yīng)該支持信息隱藏/封裝,多態(tài),繼續(xù)和動態(tài)綁定.另外,我們知道了Java完全支持這些功能,而且知道了因?yàn)镴ava是一種解釋性的語言并運(yùn)行在虛擬機(jī)的內(nèi)部,所以由Java寫成的任何程序都可以在任何支持 Java虛擬機(jī)(JVM)的操作系統(tǒng)上運(yùn)行.我們還明白了對象是代表現(xiàn)實(shí)生活中事物的軟件-編程模型以及對象是由它們的狀態(tài)和行為定義的.最后,我們知道了Java中除了原始數(shù)據(jù)對象以外一切都是對象.
  
  因?yàn)檫@種程序設(shè)計(jì)風(fēng)格中的這許多內(nèi)容都和對象以及類有關(guān),我們將在下面進(jìn)一步的考察它們.
  
  對象詳論
  使用對象的一個要害是當(dāng)你在瀏覽系統(tǒng)分析文檔或者設(shè)計(jì)文檔的時候如何來確定它們.因?yàn)閷ο笠话愦砣?地方或者事物,所以一個確定對象的基本的方法就是找出句子中所使用的名詞.這里有一個簡單的例子.在句子"一個顧客可以擁有多于一個的銀行帳號",我們就確定了兩個對象,客戶和帳號.在句子"小貓喵喵叫"中,我們能夠確定一個對象,貓.
  
  類詳論
  前面,我們學(xué)習(xí)了一個類是定義了對象如何動作以及當(dāng)對象創(chuàng)建或者說實(shí)例化的時候應(yīng)該包含些什么的實(shí)體.在對動物的討論中,我們可以說,"狗兒汪汪叫,貓喵喵叫,鴨子嘎嘎叫."確定句子中的對象我們就得到了狗,貓和鴨子.至于汪汪叫,喵喵叫,嘎嘎叫,那都是我們對象發(fā)出的行為動作.
  
  要實(shí)現(xiàn)這些對象,我們需要創(chuàng)建三個對象分別叫Dog,Cat和DUCk.要實(shí)現(xiàn)它們的行為,我們可以為每一個這些對象創(chuàng)建代表每個對象發(fā)出的聲音的方法,而且我們把這個方法叫做speak或者,假如我們發(fā)揮想象力的話還可以把這個方法叫做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.    }
  }
  
  class Cat
  {
    public void sayHello()
    {
      System.out.println("Meow");
    }
  }
  
  class Duck
  {
    public void sayHello()
    {
      System.out.println("Quack");
    }
  }
  
  在編譯并運(yùn)行了這個程序以后,輸出應(yīng)該如下:
  Bark
  Meow
  Quack
  
  看看我們的程序,我們馬上就注重到了一些事情:每個對象代表了一種動物,而每個對象實(shí)現(xiàn)了一個相同的方法,sayHello.假設(shè)我們想要給對象更多的功能以及用來代表對象所指的動物的方法和屬性.比方說,我們可以添加一個方法來確定一個動物是不是哺乳類的,或者我們添加一個方法來確定一個動物是不是肉食性的.我們可以通過給每一個對象添加這兩種方法來實(shí)現(xiàn)或者我們也能夠使用OOP的兩個最強(qiáng)大的功能:繼續(xù)和多態(tài).
  
  因?yàn)樗械膶ο蠖即硪粋€對象,所以我們將創(chuàng)建一個被稱為"基類"或是"超類"的類,它的名字是Animal.我們?nèi)缓罂梢宰屛覀兊膶ο髲腁nimal類繼續(xù)相同的特點(diǎn)并強(qiáng)制每個對象只實(shí)現(xiàn)與Animal類不同的功能.
  
  Java用extends要害字指明一個類從另一個繼續(xù).讓我們利用繼續(xù)和多態(tài)的概念獲得代碼重用的好處來重建我們的程序并使得每個對象只實(shí)現(xiàn)與基類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
  {
    public boolean isAMammal()
    {
      return(false);
    }
  
    public boolean isCarnivorous()
    {
      return(false);
    }
  
    public String getHello()
    {
      return("Quack");
    }
  }
  
  在編譯并運(yùn)行我們的程序以后,輸出應(yīng)該如下:
  A dog says Bark, is carnivorous: true, is a mammal: true
  A cat says Meow, is carnivorous: true, is a mammal: true
  A duck says Quack, is carnivorous: false, is a mammal: false
  
  看看我們的例子,你將發(fā)現(xiàn)我們定義了一個叫做Animal的新類,它定義了三個方法:isAMammal, isCarnivorous, 和 getHello.你一概還注重到了,我們在每個現(xiàn)存的類申明的前面都添加了extends Animal這個語句.這個語句告訴編譯器這些對象是Animal類的子類.
  
  因?yàn)榉椒╥sAMammal 和 isCarnivorous 都返回 true,所以Dog和Cat類用不著重新實(shí)現(xiàn)--即"重載"這兩個方法.但是鴨子既不是哺乳動物又不是肉食性的,所以Duck類需要重載這兩種方法來返回正確的值.我們所有的對象都以自己獨(dú)特的方式說"hello",所以它們都需要重載getHello方法.因?yàn)槊糠N動物說"hello"的方式都不同,所以我們在基類中將getHello方法申明為抽象的,而且我們沒有給這個方法一個函數(shù)體.這就迫使Animal的每一個子類重載getHello方法并根據(jù)每一個特定動物的需要來定義它.
  
  因?yàn)槲覀儗etHello方法申明為虛擬的,我們就不能直接實(shí)例化Animal對象.因此,我們需要將Animal類也申明為抽象的.我們通過在Animal類定義的開始行添加abstract要害字來實(shí)現(xiàn)這一點(diǎn).子類重載它們基類的方法的能力就是多態(tài).多態(tài)使得子類能夠使用基類的方法或是在這些方法不足的時候重載它們.這就實(shí)現(xiàn)了代碼重用,加快了代碼的實(shí)現(xiàn)過程,而且它還隔離和程序中的bug,使得程序的維護(hù)更輕易.
  
  總結(jié)
  在本文中,我們學(xué)習(xí)了如何確定潛在的對象.我們還學(xué)習(xí)了如何使用繼續(xù)和多態(tài)來加快我們的代碼實(shí)現(xiàn)過程并隔離錯誤,這使得代碼的維護(hù)過程更加輕易.下一次,我們將展開討論多態(tài)和繼續(xù)的概念并開始我們對動態(tài)綁定的討論.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平舆县| 夏河县| 碌曲县| 出国| 西丰县| 金寨县| 吴堡县| 积石山| 杭锦后旗| 铁力市| 永修县| 宁远县| 乌恰县| 平罗县| 丰原市| 八宿县| 罗平县| 桐梓县| 鹤壁市| 宿松县| 沧州市| 龙川县| 三河市| 文登市| 瑞安市| 元谋县| 辽中县| 陆丰市| 榆林市| 辽阳市| 铁岭市| 正蓝旗| 中牟县| 仁布县| 离岛区| 太保市| 太和县| 洪江市| 宜兰县| 五指山市| 云阳县|