明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

JAVA圖文說明教程 第3講 Java語言中的面向?qū)ο筇卣?/h1>

[摘要]3.1 面向?qū)ο蠹夹g基礎   3.1.1 面向?qū)ο蟮幕靖拍?  面向?qū)ο蟮幕舅枷?  面向?qū)ο笫且环N新興的程序設計方法,或者是一種新的程序設計規(guī)范(paradigm),其基本思想是使用對象、類、繼承、封裝、消息等基本概念來進行程序設計。從現(xiàn)實世界中客觀存在的事物(即對象)出發(fā)來構造軟件系統(tǒng),并...
3.1 面向?qū)ο蠹夹g基礎

  3.1.1 面向?qū)ο蟮幕靖拍?

  面向?qū)ο蟮幕舅枷?
  面向?qū)ο笫且环N新興的程序設計方法,或者是一種新的程序設計規(guī)范(paradigm),其基本思想是使用對象、類、繼承、封裝、消息等基本概念來進行程序設計。從現(xiàn)實世界中客觀存在的事物(即對象)出發(fā)來構造軟件系統(tǒng),并且在系統(tǒng)構造中盡可能運用人類的自然思維方式。開發(fā)一個軟件是為了解決某些問題,這些問題所涉及的業(yè)務范圍稱作該軟件的問題域。其應用領域不僅僅是軟件,還有計算機體系結構和人工智能等。

   1. 對象的基本概念

  對象是系統(tǒng)中用來描述客觀事物的一個實體,它是構成系統(tǒng)的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。從更抽象的角度來說,對象是問題域或?qū)崿F(xiàn)域中某些事物的一個抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用;它是一組屬性和有權對這些屬性進行操作的一組服務的封裝體?陀^世界是由對象和對象之間的聯(lián)系組成的。

  主動對象是一組屬性和一組服務的封裝體,其中至少有一個服務不需要接收消息就能主動執(zhí)行(稱作主動服務)。
  
  2. 類的基本概念

  把眾多的事物歸納、劃分成一些類是人類在認識客觀世界時經(jīng)常采用的思維方法。分類的原則是抽象。類是具有相同屬性和服務的一組對象的集合,它為屬于該類的所有對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務兩個主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個獨立的程序單位,它應該有一個類名并包括屬性說明和服務說明兩個主要部分。類與對象的關系就如模具和鑄件的關系,類的實例化結果就是對象,而對一類對象的抽象就是類。
  

  3. 消息

  消息就是向?qū)ο蟀l(fā)出的服務請求,它應該包含下述信息:提供服務的對象標識、服務標識、輸入信息和回答信息。服務通常被稱為方法或函數(shù)。

  3.1.2 面向?qū)ο蟮幕咎卣?

  1.封裝性

  封裝性就是把對象的屬性和服務結合成一個獨立的相同單位,并盡可能隱蔽對象的內(nèi)部細節(jié),包含兩個含義:
  ◇ 把對象的全部屬性和全部服務結合在一起,形成一個不可分割的獨立單位(即對象)。
  ◇ 信息隱蔽,即盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一個邊界〔或者說形成一道屏障〕,只保留有限的對外接口使之與外部發(fā)生聯(lián)系。
  封裝的原則在軟件上的反映是:要求使對象以外的部分不能隨意存取對象的內(nèi)部數(shù)據(jù)(屬性),從而有效的避免了外部錯誤對它的"交叉感染",使軟件錯誤能夠局部化,大大減少查錯和排錯的難度。
  

  2.繼承性

  特殊類的對象擁有其一般類的全部屬性與服務,稱作特殊類對一般類的繼承。例如,輪船、客輪;人、大人。一個類可以是多個一般類的特殊類,它從多個一般類中繼承了屬性與服務,這稱為多繼承。例如,客輪是輪船和客運工具的特殊類。在java語言中,通常我們稱一般類為父類(superclass,超類),特殊類為子類(subclass)。

  3.多態(tài)性

  對象的多態(tài)性是指在一般類中定義的屬性或服務被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個屬性或服務在一般類及其各個特殊類中具有不同的語義。例如:"幾何圖形"的"繪圖"方法,"橢圓"和"多邊形"都是"幾何圖"的子類,其"繪圖"方法功能不同。

  3.1.3 面向?qū)ο蟪绦蛟O計方法

   OOA-Object Oriented Analysis     面向?qū)ο蟮姆治?
  
  OOD-Object Oriented Design      面向?qū)ο蟮脑O計
  
  OOI-Object Oriented Implementation  面向?qū)ο蟮膶崿F(xiàn)

  3.2 Java語言的面向?qū)ο筇匦?

  3.2.1 類

  類是java中的一種重要的復合數(shù)據(jù)類型,是組成java程序的基本要素。它封裝了一類對象的狀態(tài)和方法,是這一類對象的原形。一個類的實現(xiàn)包括兩個部分:類聲明和類體。

  1.類聲明:

  [public][abstract final] class className [extends superclassName] [implements interfaceNameList]
  {……}

  其中,修飾符public,abstract,final 說明了類的屬性,className為類名,superclassName為類的父類的名字,interfaceNameList為類所實現(xiàn)的接口列表。

  2.類體

  類體定義如下:
  class className
  {[public protected private ] [static]
  [final] [transient] [volatile] type
  variableName;                 //成員變量
  [public protected private ] [static]
  [final abstract] [native] [synchronized]
  returnType methodName([paramList]) [throws exceptionList]
   {statements}                 //成員方法
  }

  3.成員變量

  成員變量的聲明方式如下:
  [public protected private ] [static]
  [final] [transient] [volatile] type
  variableName;                 //成員變量
  其中,
  static: 靜態(tài)變量(類變量);相對于實例變量
  final: 常量
  transient: 暫時性變量,用于對象存檔
  volatile: 貢獻變量,用于并發(fā)線程的共享

  4.成員方法

  方法的實現(xiàn)包括兩部分內(nèi)容:方法聲明和方法體。
  [public protected private ] [static]
  [final  abstract] [native] [synchronized]
  returnType methodName([paramList])
  [throws exceptionList]            //方法聲明
   {statements}                //方法體

  方法聲明中的限定詞的含義:
  static: 類方法,可通過類名直接調(diào)用
  abstract: 抽象方法,沒有方法體
  final: 方法不能被重寫
  native: 集成其它語言的代碼
  synchronized: 控制多個并發(fā)線程的訪問

  ◇ 方法聲明
  方法聲明包括方法名、返回類型和外部參數(shù)。其中參數(shù)的類型可以是簡單數(shù)據(jù)類型,也可以是復合數(shù)據(jù)類型(又稱引用數(shù)據(jù)類型)。

  對于簡單數(shù)據(jù)類型來說,java實現(xiàn)的是值傳遞,方法接收參數(shù)的值,但不能改變這些參數(shù)的值。如果要改變參數(shù)的值,則用引用數(shù)據(jù)類型,因為引用數(shù)據(jù)類型傳遞給方法的是數(shù)據(jù)在內(nèi)存中的地址,方法中對數(shù)據(jù)的操作可以改變數(shù)據(jù)的值。

  例3-1說明了簡單數(shù)據(jù)類型與引用數(shù)據(jù)的區(qū)別。

  【例3-1】
  import java.io.*;
  public class PassTest{
  float ptValue;
  public static void main(String args[]) {
  int val;
  PassTest pt=new PassTest();
  val=11;
  System.out.println("Original Int Value is:"+val);
  pt.changeInt(val);                   //值參數(shù)
  System.out.println("Int Value after Change is:" +val); /*值參數(shù)
                    值的修改,沒有影響值參數(shù)的值*/
  pt.ptValue=101f;
  System.out.println("Original ptValue is:"+pt.ptValue);
  pt.changeObjValue(pt); //引用類型的參數(shù)
  System.out.println("ptValue after Change is:"+pt.ptValue);/* 引用參數(shù)值的修改,改變了引用參數(shù)的值*/
  }
  public void changeInt(int value){
  value=55;            //在方法內(nèi)部對值參數(shù)進行了修改
  }
  public void changeObjValue(PassTest ref){
  ref.ptValue=99f;        //在方法內(nèi)部對引用參數(shù)進行了修改
    }
  }

   運行結果 c:\>java PassTest
  Original Int Value is : 11
  Int Value after Change is: 11
  Original ptValue is: 101.0
  ptValue after Change is : 99.0



  ◇ 方法體
  方法體是對方法的實現(xiàn),它包括局部變量的聲明以及所有合法的Java指令。方法體中聲明的局部變量的作用域在該方法內(nèi)部。若局部變量與類的成員變量同名,則類的成員變量被隱藏。

  例3-2 說明了局部變量z和類成員變量z的作用域是不同的。

  【例3-2】
  import java.io.*;
  class Variable{
  int x=0,y=0,z=0;              //類的成員變量
  void init(int x,int y) {
  this.x=x; this.y=y;
  int z=5;                 //局部變量
  System.out.println("** in init**");
  System.out.println("x="+x+" y="+y+" z="+z);
    }
  }
  public class VariableTest{
  public static void main(String args[]){
  Variable v=new Variable();
  System.out.println("**before init**");
  System.out.println("x="+v.x+" y="+ v.y+" z="+v.z);
  v.init(20,30);
  System.out.println("**after init**");
  System.out.println("x="+v.x+ " y="+ v.y+" z="+v.z);
    }
  }

   運行結果

  c:\>java VariableTest
  **before init**
  x=0 y=0 z=0
  ** in init **
  x=20 y=30 z=5
  **after init**
  x=20 y=30 z=0




  上例中我們用到了this,這是因為init()方法的參數(shù)名與類的成員變量x,y的名字相同,而參數(shù)名會隱藏成員變量,所以在方法中,為了區(qū)別參數(shù)和類的成員變量,我們必須使用this。this-----用在一個方法中引用當前對象,它的值是調(diào)用該方法的對象。返回值須與返回類型一致,或者完全相同,或是其子類。當返回類型是接口時,返回值必須實現(xiàn)該接口。

  5.方法重載
  
  方法重載是指多個方法享有相同的名字,但是這些方法的參數(shù)必須不同,或者是參數(shù)的個數(shù)不同,或者是參數(shù)類型不同。返回類型不能用來區(qū)分重載的方法。

  參數(shù)類型的區(qū)分度一定要足夠,例如不能是同一簡單類型的參數(shù),如int與long。

  【例3-3】
  import java.io.*;
  class MethodOverloading{
  void receive(int i) {
  System.out.println("Receive one int data");
  System.out.println("i="+i);
  }
  void receive(int x, int y) {
  System.out.println("Receive two int datas");
  System.out.println("x="+x+" y="+y);
    } 
  }
  public class MethodOverloadingTest{
  public static void main(String args[]) {
  MethodOverloading mo=new MethodOverloading();
  mo.receive(1);
  mo.receive(2,3);

    } 
  }

  運行結果(編譯器會根據(jù)參數(shù)的個數(shù)和類型來決定當前所使用的方法)

  c:\>java MethodOverloadingTest
  Receive one int data
  i=1
  Receive two int datas
  x=2 y=3