<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    轉(zhuǎn)----Java語(yǔ)言中的面向?qū)ο筇匦?/a>

    第三講 Java語(yǔ)言中的面向?qū)ο筇匦?/TD>
    【課前思考】
      1. 什么是對(duì)象?什么是類?什么是包?什么是接口?什么是內(nèi)部類?
      2. 面向?qū)ο缶幊痰奶匦杂心娜齻€(gè)?它們各自又有哪些特性?
      3. 你知道java語(yǔ)言在面向?qū)ο缶幊谭矫嬗泻为?dú)特的特點(diǎn)嗎?

    難點(diǎn):
      1. 理解方法重載和方法重寫,不要混淆了兩者的使用。
      2. 類變量和類方法的使用。
      3. 接口的使用。
    3.1 面向?qū)ο蠹夹g(shù)基礎(chǔ)

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

    1. 對(duì)象的基本概念
      對(duì)象是系統(tǒng)中用來(lái)描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成。

    主動(dòng)對(duì)象是一組屬性和一組服務(wù)的封裝體,其中至少有一個(gè)服務(wù)不需要接收消息就能主動(dòng)執(zhí)行(稱作主動(dòng)服務(wù))。
    2. 類的基本概念
    類是具有相同屬性和服務(wù)的一組對(duì)象的集合,它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分。在面向?qū)ο蟮木幊陶Z(yǔ)言中,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說(shuō)明和服務(wù)說(shuō)明兩個(gè)主要部分。

    3. 消息

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

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

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

    2.繼承性
      特殊類的對(duì)象擁有其一般類的全部屬性與服務(wù),稱作特殊類對(duì)一般類的繼承。

    一個(gè)類可以是多個(gè)一般類的特殊類,它從多個(gè)一般類中繼承了屬性與服務(wù),這稱為多繼承。

    在java語(yǔ)言中,通常我們稱一般類為父類(superclass,超類),特殊類為子類(subclass)。

    3.多態(tài)性
      對(duì)象的多態(tài)性是指在一般類中定義的屬性或服務(wù)被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個(gè)屬性或服務(wù)在一般類及其各個(gè)特殊類中具有不同的語(yǔ)義。例如:"幾何圖形"的"繪圖"方法,"橢圓"和"多邊形"都是"幾何圖"的子類,其"繪圖"方法功能不同。
    3.1.3 面向?qū)ο蟪绦蛟O(shè)計(jì)方法
      OOA-Object Oriented Analysis     面向?qū)ο蟮姆治?
      OOD-Object Oriented Design      面向?qū)ο蟮脑O(shè)計(jì)
      OOI-Object Oriented Implementation  面向?qū)ο蟮膶?shí)現(xiàn)
    3.2 Java語(yǔ)言的面向?qū)ο筇匦?

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

    1.類聲明:
      [public][abstract|final] class className [extends superclassName] [implements interfaceNameList]
      {……}
      其中,修飾符public,abstract,final 說(shuō)明了類的屬性,className為類名,superclassName為類的父類的名字,interfaceNameList為類所實(shí)現(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)變量(類變量);相對(duì)于實(shí)例變量
      final: 常量
      transient: 暫時(shí)性變量,用于對(duì)象存檔,用于對(duì)象的串行化,見(jiàn)對(duì)象的串行化一節(jié)
      volatile: 貢獻(xiàn)變量,用于并發(fā)線程的共享
     4.成員方法
      方法的實(shí)現(xiàn)包括兩部分內(nèi)容:方法聲明和方法體。
      [public | protected | private ] [static]
      [final | abstract] [native] [synchronized]
      returnType methodName([paramList])
      [throws exceptionList]            //方法聲明
       {statements}                //方法體
      方法聲明中的限定詞的含義:
      static: 類方法,可通過(guò)類名直接調(diào)用
      abstract: 抽象方法,沒(méi)有方法體
      final: 方法不能被重寫
      native: 集成其它語(yǔ)言的代碼
      synchronized: 控制多個(gè)并發(fā)線程的訪問(wèn)
      ◇ 方法聲明
      方法聲明包括方法名、返回類型和外部參數(shù)。其中參數(shù)的類型可以是簡(jiǎn)單數(shù)據(jù)類型,也可以是復(fù)合數(shù)據(jù)類型(又稱引用數(shù)據(jù)類型)。
      對(duì)于簡(jiǎn)單數(shù)據(jù)類型來(lái)說(shuō),java實(shí)現(xiàn)的是值傳遞,方法接收參數(shù)的值,但不能改變這些參數(shù)的值。如果要改變參數(shù)的值,則用引用數(shù)據(jù)類型,因?yàn)橐脭?shù)據(jù)類型傳遞給方法的是數(shù)據(jù)在內(nèi)存中的地址,方法中對(duì)數(shù)據(jù)的操作可以改變數(shù)據(jù)的值。
      例3-1說(shuō)明了簡(jiǎn)單數(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ù)
                        值的修改,沒(méi)有影響值參數(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)部對(duì)值參數(shù)進(jìn)行了修改
      }
      public void changeObjValue(PassTest ref){
      ref.ptValue=99f;        //在方法內(nèi)部對(duì)引用參數(shù)進(jìn)行了修改
        }
      }

    ◇ 方法體
      方法體是對(duì)方法的實(shí)現(xiàn),它包括局部變量的聲明以及所有合法的Java指令。方法體中聲明的局部變量的作用域在該方法內(nèi)部。若局部變量與類的成員變量同名,則類的成員變量被隱藏。
    為了區(qū)別參數(shù)和類的成員變量,我們必須使用this。this-----用在一個(gè)方法中引用當(dāng)前對(duì)象,它的值是調(diào)用該方法的對(duì)象。返回值須與返回類型一致,或者完全相同,或是其子類。當(dāng)返回類型是接口時(shí),返回值必須實(shí)現(xiàn)該接口。
    5.方法重載
     方法重載是指多個(gè)方法享有相同的名字,但是這些方法的參數(shù)必須不同,或者是參數(shù)的個(gè)數(shù)不同,或者是參數(shù)類型不同。返回類型不能用來(lái)區(qū)分重載的方法。
      參數(shù)類型的區(qū)分度一定要足夠,例如不能是同一簡(jiǎn)單類型的參數(shù),如int與long。編譯器會(huì)根據(jù)參數(shù)的個(gè)數(shù)和類型來(lái)決定當(dāng)前所使用的方法。

    6. 構(gòu)造方法
      ◇ 構(gòu)造方法是一個(gè)特殊的方法。Java 中的每個(gè)類都有構(gòu)造方法,用來(lái)初始化該類的一個(gè)對(duì)象。
      ◇ 構(gòu)造方法具有和類名相同的名稱,而且不返回任何數(shù)據(jù)類型。
      ◇ 重載經(jīng)常用于構(gòu)造方法。
      ◇ 構(gòu)造方法只能由new運(yùn)算符調(diào)用

    3.2.2 對(duì)象
      類實(shí)例化可生成對(duì)象,對(duì)象通過(guò)消息傳遞來(lái)進(jìn)行交互。消息傳遞即激活指定的某個(gè)對(duì)象的方法以改變其狀態(tài)或讓它產(chǎn)生一定的行為。一個(gè)對(duì)象的生命周期包括三個(gè)階段:生成、使用和消除。

    對(duì)象的清除
      當(dāng)不存在對(duì)一個(gè)對(duì)象的引用時(shí),該對(duì)象成為一個(gè)無(wú)用對(duì)象。Java的垃圾收集器自動(dòng)掃描對(duì)象的動(dòng)態(tài)內(nèi)存區(qū),把沒(méi)有引用的對(duì)象作為垃圾收集起來(lái)并釋放。
      System.gc( );  System.exit();//terminate the current JVM
      當(dāng)系統(tǒng)內(nèi)存用盡或調(diào)用System.gc( )要求垃圾回收時(shí),垃圾回收線程與系統(tǒng)同步運(yùn)行。
    3.2.3 面向?qū)ο筇匦?
      java語(yǔ)言中有三個(gè)典型的面向?qū)ο蟮奶匦裕悍庋b性、繼承性和多態(tài)性。

    1. 封裝性
      java語(yǔ)言中,對(duì)象就是對(duì)一組變量和相關(guān)方法的封裝,其中變量表明了對(duì)象的狀態(tài),方法表明了對(duì)象具有的行為。通過(guò)對(duì)象的封裝,實(shí)現(xiàn)了模塊化和信息隱藏。通過(guò)對(duì)類的成員施以一定的訪問(wèn)權(quán)限,實(shí)現(xiàn)了類中成員的信息隱藏。
    ◇ java類中的限定詞
      java語(yǔ)言中有四種不同的限定詞,提供了四種不同的訪問(wèn)權(quán)限。
      1) private
      類中限定為private的成員,只能被這個(gè)類本身訪問(wèn)。
      如果一個(gè)類的構(gòu)造方法聲明為private,則其它類不能生成該類的一個(gè)實(shí)例。
      2) default
      類中不加任何訪問(wèn)權(quán)限限定的成員屬于缺省的(default)訪問(wèn)狀態(tài):friend,可以被這個(gè)類本身和同一個(gè)包中的類所訪問(wèn)。
    3) protected
      類中限定為protected的成員,可以被這個(gè)類本身、它的子類(包括同一個(gè)包中以及不同包中的子類)和同一個(gè)包中的所有其他的類訪問(wèn)。
    4) public
      類中限定為public的成員,可以被所有的類訪問(wèn)。
    【表3-1】 java中類的限定詞的作用范圍比較


    同一個(gè)類
    同一個(gè)包
    不同包的子類
    不同包非子類

    private
    *




    default
    *
    *



    protected
    *
    *
    *


    public
    *
    *
    *
    *




    2. 繼承性
      通過(guò)繼承實(shí)現(xiàn)代碼復(fù)用。Java中所有的類都是通過(guò)直接或間接地繼承java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問(wèn)權(quán)限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量。但Java不支持多重繼承,即一個(gè)類從多個(gè)超類派生的能力。
    ◇ 成員變量的隱藏和方法的重寫
      子類通過(guò)隱藏父類的成員變量和重寫父類的方法,可以把父類的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。
    例如:
      class SuperClass{
        int x; …
        void setX( ){ x=0; } …
      }
      class SubClass extends SuperClass{
        int x;   //隱藏了父類的變量x
        …
        void setX( ) { //重寫了父類的方法 setX()
        x=5; } ….
      }
      注意:子類中重寫的方法和父類中被重寫的方法要具有相同的名字,相同的參數(shù)表和相同的返回類型,只是函數(shù)體不同。
      ◇ super
      java中通過(guò)super來(lái)實(shí)現(xiàn)對(duì)父類成員的訪問(wèn),super用來(lái)引用當(dāng)前對(duì)象的父類。Super 的使用有三種情況:
      1)訪問(wèn)父類被隱藏的成員變量,如:
        super.variable;
      2)調(diào)用父類中被重寫的方法,如:
        super.Method([paramlist]);
      3)調(diào)用父類的構(gòu)造函數(shù),如:
        super([paramlist]);

    【例3-5】
      import java.io.*;
      class SuperClass{
        int x;
        SuperClass( ) {
         x=3;
         System.out.println("in SuperClass : x=" +x);
        }
         void doSomething( ) {
         System.out.println("in SuperClass.doSomething()");
        }
      }
      class SubClass extends SuperClass {
        int x;
        SubClass( ) {
         super( );    //調(diào)用父類的構(gòu)造方法
         x=5;      //super( ) 要放在方法中的第一句
         System.out.println("in SubClass :x="+x);
        }
         void doSomething( ) {
         super.doSomething( ); //調(diào)用父類的方法
         System.out.println("in SubClass.doSomething()");
         System.out.println("super.x="+super.x+" sub.x="+x);
        }
      }
      public class Inheritance {
         public static void main(String args[]) {
         SubClass subC=new SubClass();
         subC.doSomething();
        }
      }

    3. 多態(tài)性
      在java語(yǔ)言中,多態(tài)性體現(xiàn)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性(編譯時(shí)多態(tài))和方法重寫實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)多態(tài))。
      1) 編譯時(shí)多態(tài)
      在編譯階段,具體調(diào)用哪個(gè)被重載的方法,編譯器會(huì)根據(jù)參數(shù)的不同來(lái)靜態(tài)確定調(diào)用相應(yīng)的方法。
      2) 運(yùn)行時(shí)多態(tài)
      由于子類繼承了父類所有的屬性(私有的除外),所以子類對(duì)象可以作為父類對(duì)象使用。程序中凡是使用父類對(duì)象的地方,都可以用子類對(duì)象來(lái)代替。一個(gè)對(duì)象可以通過(guò)引用子類的實(shí)例來(lái)調(diào)用子類的方法。
      ◇ 重寫方法的調(diào)用原則:java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例,來(lái)決定調(diào)用哪個(gè)方法。對(duì)子類的一個(gè)實(shí)例,如果子類重寫了父類的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法(未重寫),則運(yùn)行時(shí)系統(tǒng)調(diào)用父類的方法。
    在例3-6中,父類對(duì)象a引用的是子類的實(shí)例,所以,java運(yùn)行時(shí)調(diào)用子類B的callme方法。

    【例3-6】
      import java.io.*;
      class A{
         void callme( ) {
          System.out.println("Inside A''s callme()method");
         }
      }
      class B extends A{
         void callme( ) {
          System.out.println("Inside B''s callme() Method");
         }
      }
      public class Dispatch{
         public static void main(String args[]) {
          A a=new B();
          a.callme( );
         }
      }
    ◇ 方法重寫時(shí)應(yīng)遵循的原則:
      1)改寫后的方法不能比被重寫的方法有更嚴(yán)格的訪問(wèn)權(quán)限(可以相同)。
      2)改寫后的方法不能比重寫的方法產(chǎn)生更多的例外。
    4. 其它
      ◇ final 關(guān)鍵字
      final 關(guān)鍵字可以修飾類、類的成員變量和成員方法,但final 的作用不同。
      1) final 修飾成員變量:
      final修飾變量,則成為常量,例如
      final type variableName;
      修飾成員變量時(shí),定義時(shí)同時(shí)給出初始值,且以后不能被修改,而修飾局部變量時(shí)不做要求。
      2) final 修飾成員方法:
      final修飾方法,則該方法不能被子類重寫
      final returnType methodName(paramList){
      …
      }

      3) final 類:
      final修飾類,則類不能被繼承
      final class finalClassName{
      …
      }
      ◇ 實(shí)例成員和類成員
      用static 關(guān)鍵字可以聲明類變量和類方法,其格式如下:
      static type classVar;
      static returnType classMethod({paramlist}) {
      …
      }
     如果在聲明時(shí)不用static 關(guān)鍵字修飾,則聲明為實(shí)例變量和實(shí)例方法。
      1) 實(shí)例變量和類變量
      每個(gè)對(duì)象的實(shí)例變量都分配內(nèi)存,通過(guò)該對(duì)象來(lái)訪問(wèn)這些實(shí)例變量,不同的實(shí)例變量是不同的。
      類變量?jī)H在生成第一個(gè)對(duì)象時(shí)分配內(nèi)存,所有實(shí)例對(duì)象共享同一個(gè)類變量,每個(gè)實(shí)例對(duì)象對(duì)類變量的改變都會(huì)影響到其它的實(shí)例對(duì)象。類變量可通過(guò)類名直接訪問(wèn),無(wú)需先生成一個(gè)實(shí)例對(duì)象,也可以通過(guò)實(shí)例對(duì)象訪問(wèn)類變量。
      2) 實(shí)例方法和類方法
      實(shí)例方法可以對(duì)當(dāng)前對(duì)象的實(shí)例變量進(jìn)行操作,也可以對(duì)類變量進(jìn)行操作,實(shí)例方法由實(shí)例對(duì)象調(diào)用。
      但類方法不能訪問(wèn)實(shí)例變量,只能訪問(wèn)類變量。類方法可以由類名直接調(diào)用,也可由實(shí)例對(duì)象進(jìn)行調(diào)用。類方法中不能使用this或super關(guān)鍵字。
      例3-7 是關(guān)于實(shí)例成員和類成員的例子。
    【例3-7】
      class Member {
        static int classVar;
        int instanceVar;
        static void setClassVar(int i) {
         classVar=i;
         // instanceVar=i; // 類方法不能訪問(wèn)實(shí)例變量
        }
        static int getClassVar()
         { return classVar; }
        void setInstanceVar(int i)
         { classVar=i; //實(shí)例方法不但可以訪問(wèn)類變量,也可以實(shí)例變量
         instanceVar=i; }
         int getInstanceVar( )
         { return instanceVar; }
        }
        public class MemberTest{
         public static void main(String args[]) {
             Member m1=new member();
             Member m2=new member();
             m1.setClassVar(1);
             m2.setClassVar(2);
             System.out.println("m1.classVar="+m1.getClassVar()+"
                       m2.ClassVar="+m2.getClassVar());
             m1.setInstanceVar(11);
             m2.setInstanceVar(22);
             System.out.println("m1.InstanceVar="+m1.getInstanceVar
                  ()+" m2.InstanceVar="+m2.getInstanceVar());
         }
        }
    ◇ 類java.lang.Object
      類java.lang.Object處于java開(kāi)發(fā)環(huán)境的類層次的根部,其它所有的類都是直接或間接地繼承了此類。該類定義了一些最基本的狀態(tài)和行為。下面,我們介紹一些常用的方法。
      equals() :比較兩個(gè)對(duì)象(引用)是否相同。
      getClass():返回對(duì)象運(yùn)行時(shí)所對(duì)應(yīng)的類的表示,從而可得到相應(yīng)的信息。
      toString():用來(lái)返回對(duì)象的字符串表示。
      finalize():用于在垃圾收集前清除對(duì)象。
      notify(),notifyAll(),wait():用于多線程處理中的同步。

    3.2.4抽象類和接口

     1. 抽象類
      java語(yǔ)言中,用abstract 關(guān)鍵字來(lái)修飾一個(gè)類時(shí),這個(gè)類叫做抽象類,用abstract 關(guān)鍵字來(lái)修飾一個(gè)方法時(shí),這個(gè)方法叫做抽象方法。格式如下:
      abstract class abstractClass{ …} //抽象類
      abstract returnType abstractMethod([paramlist]) //抽象方法
      抽象類必須被繼承,抽象方法必須被重寫。抽象方法只需聲明,無(wú)需實(shí)現(xiàn);抽象類不能被實(shí)例化,抽象類不一定要包含抽象方法。若類中包含了抽象方法,則該類必須被定義為抽象類。

    若一個(gè)類繼承了一個(gè)抽象類,則抽象類的抽象方法必須被實(shí)現(xiàn),否則子類必須聲明為abstract.
     2. 接口
      接口是抽象類的一種,只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn),且其方法都是抽象方法。它的用處體現(xiàn)在下面幾個(gè)方面:
      ◇ 通過(guò)接口實(shí)現(xiàn)不相關(guān)類的相同行為,而無(wú)需考慮這些類之間的關(guān)系。
      ◇ 通過(guò)接口指明多個(gè)類需要實(shí)現(xiàn)的方法。
      ◇ 通過(guò)接口了解對(duì)象的交互界面,而無(wú)需了解對(duì)象所對(duì)應(yīng)的類。
    1)接口的定義
      接口的定義包括接口聲明和接口體。
      接口聲明的格式如下:
      [public] interface interfaceName[extends listOfSuperInterface] { … }
      extends 子句與類聲明的extends子句基本相同,不同的是一個(gè)接口可有多個(gè)父接口,用逗號(hào)隔開(kāi),而一個(gè)類只能有一個(gè)父類。
      接口體包括常量定義和方法定義
      常量定義格式為:type NAME=value; 該常量被實(shí)現(xiàn)該接口的多個(gè)類共享; 具有public ,final, static的屬性。在接口中只能聲明常量,不可以聲明變量。
      方法體定義格式為:(具有 public和abstract屬性,不能聲明為protected)
      returnType methodName([paramlist]);

    注意:在接口的實(shí)現(xiàn)類中,實(shí)現(xiàn)的接口方法必須聲明為public ,因?yàn)榻涌谥卸x的方法為public(默認(rèn))。所以其實(shí)現(xiàn)必須聲明為public.否則編譯不會(huì)通過(guò)。
    2)接口的實(shí)現(xiàn)
      在類的聲明中用implements子句來(lái)表示一個(gè)類使用某個(gè)接口,在類體中可以使用接口中定義的常量,而且必須實(shí)現(xiàn)接口中定義的所有方法。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,在implements子句中用逗號(hào)分開(kāi)。
    3) 接口類型的使用
      接口作為一種引用類型來(lái)使用。任何實(shí)現(xiàn)該接口的類的實(shí)例都可以存儲(chǔ)在該接口類型的變量中,通過(guò)這些變量可以訪問(wèn)類所實(shí)現(xiàn)的接口中的方法。
    3.2.5 內(nèi)部類

     1. 內(nèi)部類的定義和使用:
      內(nèi)部類是在一個(gè)類的內(nèi)部嵌套定義的類,它可以是其它類的成員,也可以在一個(gè)語(yǔ)句塊的內(nèi)部定義,還可以在表達(dá)式內(nèi)部匿名定義。
      內(nèi)部類有如下特性:
      ◇ 一般用在定義它的類或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱.名字不能與包含它的類名相同。
      ◇ 可以使用包含它的類的靜態(tài)和實(shí)例成員變量,也可以使用它所在方法的局部變量。
      ◇ 可以定義為abstract。
      ◇ 可以聲明為private或protected。
      ◇ 若被聲明為static,就變成了頂層類,不能再使用局部變量。
      ◇ 若想在Inner Class中聲明任何static成員,則該Inner Class必須聲明為static。
    例3-8】
      import java.awt.*;
      import java.awt.event.*;
      public class TwoListenInner {
        private Frame f;
        private TextField tf;
          public static void main(String args[]) {
           TwoListenInner that=new TwoListenInner();
           that.go();
        }
        public void go() {
           f=new Frame("Two listeners example");
           f.add("North",new Label("Click and drag the mouse"));
           tf=new TextField(30);
           f.add("South",tf);
           f.addMouseMotionListener(new MouseMotionHandler());
           f.addMouseListener(new MouseEventHandler());
           f.setSize(300,300);
           f.setVisible(true);
        }
        public class MouseMotionHandler extends MouseMotionAdapter {
          public void mouseDragged(MouseEvent e){
           String s="Mouse dragging:X="+e.getX()+"Y="+e.getY();
           tf.setText(s);
          }
        }
        public class MouseEventHandler extends MouseAdapter {
          public void mouseEntered(MouseEvent e){
           String s="The mouse entered";
           tf.setText(s);
          }
          public void mouseExited(MouseEvent e){
           String s="The mouse left the building";
           tf.setText(s);
          }
        }
      }

    說(shuō)明:Frame類的add方法來(lái)自于其祖先類Container類,addMouseMotionListener和addMouseListener方法來(lái)自于其祖先類Component, addMouseListener方法的參數(shù)為MouseListener接口,MouseAdapter類是實(shí)現(xiàn)了MouseListener接口的類。可見(jiàn)圖形界面對(duì)于外部事件的響應(yīng)是通過(guò)添加listener實(shí)現(xiàn)的
    2. 匿名類的定義和使用:
      匿名類是一種特殊的內(nèi)部類,它是在一個(gè)表達(dá)式內(nèi)部包含一個(gè)完整的類定義。通過(guò)對(duì)例6-7中g(shù)o()部分語(yǔ)句的修改,我們可以看到匿名類的使用情況。
      public void go() {
             f=new Frame("Two listeners example");
             f.add("North",new Label("Click and drag the mouse"));
             tf=new TextField(30);
             f.add("South",tf);
             f.addMouseMotionListener(new MouseMotionHandler(){
             /*定義了一個(gè)匿名類,類名沒(méi)有顯式地給出,只是該類是
              MouseMotionHandler類的子類*/
               public void mouseDragged(MouseEvent e){
                 String s="Mouse dragging:X="+e.getX()+"Y
                 ="+e.getY();
                 tf.setText(s);
               }
             });
             f.addMouseListener(new MouseEventHandler());
             f.setSize(300,300);
             f.setVisible(true);
             }
     3. 內(nèi)部類的優(yōu)缺點(diǎn):
      ◇ 優(yōu)點(diǎn):節(jié)省編譯后產(chǎn)生的字節(jié)碼文件的大小
      ◇ 缺點(diǎn):使程序結(jié)構(gòu)不清楚

    習(xí)題:

    1 :造型不可以從父類向子類造型,只能從子類向父類造型。否則編譯 時(shí)可以通過(guò),執(zhí)行時(shí)會(huì)報(bào)錯(cuò)

    如:SubClass sc = new SubClass(); BaseClass bc = (BaseClass)sc ;---是正確的

    而 BaseClass bc = new BaseClass(); SubClass sc = (SubClass)bc ;---是錯(cuò)誤的

    BaseClass bc = new SubClass()也是正確的,并且在調(diào)用bc中的方法時(shí)執(zhí)行的方法體是子類的方法體,但該方法必須同時(shí)在子類,父類中同時(shí)存在,若子類中有,而父類中沒(méi)有,則不可以這樣調(diào)用bc.subMethod();

    若兩個(gè)類都繼承于同一個(gè)類(必須是直接繼承,否則不對(duì)),則這兩個(gè)類可以互相賦值,如:Panel和Frame 同繼承于Container,所以Panel p = new Frame() ;和Frame f = new Panel()都是正確的,

    posted on 2005-09-15 15:37 扭轉(zhuǎn)乾坤 閱讀(1394) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA使用技巧

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類(31)

    隨筆檔案(30)

    文章分類(32)

    文章檔案(33)

    相冊(cè)

    PHP小站-首頁(yè)

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲美女人黄网成人女| 免费jlzzjlzz在线播放视频| A片在线免费观看| 免费无码H肉动漫在线观看麻豆| 国产精品永久免费视频| fc2成年免费共享视频网站| 中文在线免费观看| 水蜜桃视频在线观看免费播放高清| 久久久久久噜噜精品免费直播 | 又粗又硬免费毛片| 国产免费人成视频在线观看| 国产免费直播在线观看视频| 啊v在线免费观看| 国产成人精品久久亚洲高清不卡 | 久久精品国产亚洲Aⅴ蜜臀色欲| 在线观看亚洲av每日更新| 亚洲AV无码久久精品成人| 亚洲美女激情视频| 亚洲欧美日韩中文无线码| 久久久久亚洲精品无码网址色欲 | 亚洲一区二区三区丝袜| 亚洲AV无码资源在线观看| 日韩一级片免费观看| 中文字幕成人免费高清在线| 久久精品免费视频观看| 国产a视频精品免费观看| 成人免费无码大片a毛片软件| 免费观看亚洲人成网站| 国产亚洲AV手机在线观看| 亚洲国产日韩一区高清在线| 亚洲免费黄色网址| 国产精品亚洲专区无码牛牛| 羞羞视频免费网站在线看| 久久国产免费福利永久| 免费萌白酱国产一区二区| 久久精品九九亚洲精品天堂| 亚洲精品亚洲人成在线麻豆| 亚洲精品人成网线在线播放va| 特黄特色大片免费| 青青草无码免费一二三区| 午夜免费福利在线|