日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

java復(fù)習(xí)

系統(tǒng) 2221 0
2. 繼承性

  通過(guò)繼承實(shí)現(xiàn)代碼復(fù)用。Java中所有的類(lèi)都是通過(guò)直接或間接地繼承java.lang.Object類(lèi)得到的。繼承而得到的類(lèi)稱(chēng)為子類(lèi),被繼承的類(lèi)稱(chēng)為父類(lèi)。子類(lèi)不能繼承父類(lèi)中訪問(wèn)權(quán)限為private的成員變量和方法。子類(lèi)可以重寫(xiě)父類(lèi)的方法,及命名與父類(lèi)同名的成員變量。但Java不支持多重繼承,即一個(gè)類(lèi)從多個(gè)超類(lèi)派生的能力。

  ◇ 創(chuàng)建子類(lèi)
  格式:
  class SubClass extends SuperClass {
  …
  }

  ◇ 成員變量的隱藏和方法的重寫(xiě)
  子類(lèi)通過(guò)隱藏父類(lèi)的成員變量和重寫(xiě)父類(lèi)的方法,可以把父類(lèi)的狀態(tài)和行為改變?yōu)樽陨淼臓顟B(tài)和行為。

  例如:
  class SuperClass{
    int x; …
    void setX( ){ x=0; } …
  }
  class SubClass extends SuperClass{
    int x;   //隱藏了父類(lèi)的變量x
    …
    void setX( ) { //重寫(xiě)了父類(lèi)的方法 setX()
    x=5; } ….
  }

  注意:子類(lèi)中重寫(xiě)的方法和父類(lèi)中被重寫(xiě)的方法要具有相同的名字,相同的參數(shù)表和相同的返回類(lèi)型,只是函數(shù)體不同。

  ◇ super
  java中通過(guò)super來(lái)實(shí)現(xiàn)對(duì)父類(lèi)成員的訪問(wèn),super用來(lái)引用當(dāng)前對(duì)象的父類(lèi)。Super 的使用有三種情況:

  1)訪問(wèn)父類(lèi)被隱藏的成員變量,如:
    super.variable;

  2)調(diào)用父類(lèi)中被重寫(xiě)的方法,如:
    super.Method([paramlist]);

  3)調(diào)用父類(lèi)的構(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)用父類(lèi)的構(gòu)造方法
     x=5;      //super( ) 要放在方法中的第一句
     System.out.println("in SubClass ="+x);
    }
     void doSomething( ) {
     super.doSomething( ); //調(diào)用父類(lèi)的方法
     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();
    }
  }

    運(yùn)行結(jié)果
c:\> java Inheritance
in SuperClass: x=3
in SubClass: x=5
in SuperClass.doSomething()
in SubClass.doSomething()
super.x=3 sub.x=5






c:\> java Dispatch
Inside B's callme() method


3. 多態(tài)性

  在java語(yǔ)言中,多態(tài)性體現(xiàn)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性(編譯時(shí)多態(tài))和方法重寫(xiě)實(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)
  由于子類(lèi)繼承了父類(lèi)所有的屬性(私有的除外),所以子類(lèi)對(duì)象可以作為父類(lèi)對(duì)象使用。程序中凡是使用父類(lèi)對(duì)象的地方,都可以用子類(lèi)對(duì)象來(lái)代替。一個(gè)對(duì)象可以通過(guò)引用子類(lèi)的實(shí)例來(lái)調(diào)用子類(lèi)的方法。

  ◇ 重寫(xiě)方法的調(diào)用原則:java運(yùn)行時(shí)系統(tǒng)根據(jù)調(diào)用該方法的實(shí)例,來(lái)決定調(diào)用哪個(gè)方法。對(duì)子類(lèi)的一個(gè)實(shí)例,如果子類(lèi)重寫(xiě)了父類(lèi)的方法,則運(yùn)行時(shí)系統(tǒng)調(diào)用子類(lèi)的方法;如果子類(lèi)繼承了父類(lèi)的方法(未重寫(xiě)),則運(yùn)行時(shí)系統(tǒng)調(diào)用父類(lèi)的方法。

  在例3-6中,父類(lèi)對(duì)象a引用的是子類(lèi)的實(shí)例,所以,java運(yùn)行時(shí)調(diào)用子類(lèi)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( );
     }
  }

    運(yùn)行結(jié)果

  ◇ 方法重寫(xiě)時(shí)應(yīng)遵循的原則:
  1)改寫(xiě)后的方法不能比被重寫(xiě)的方法有更嚴(yán)格的訪問(wèn)權(quán)限(可以相同)。
  2)改寫(xiě)后的方法不能比重寫(xiě)的方法產(chǎn)生更多的例外

4. 其它

  ◇ final 關(guān)鍵字
  final 關(guān)鍵字可以修飾類(lèi)、類(lèi)的成員變量和成員方法,但final 的作用不同。

  1) final 修飾成員變量:
  final修飾變量,則成為常量,例如
  final type variableName;
  修飾成員變量時(shí),定義時(shí)同時(shí)給出初始值,而修飾局部變量時(shí)不做要求。

  2) final 修飾成員方法:
  final修飾方法,則該方法不能被子類(lèi)重寫(xiě)
  final returnType methodName(paramList){
  …
  }

  3) final 類(lèi):
  final修飾類(lèi),則類(lèi)不能被繼承
  final class finalClassName{
  …
  }

  ◇ 實(shí)例成員和類(lèi)成員
  用static 關(guān)鍵字可以聲明類(lèi)變量和類(lèi)方法,其格式如下:
  static type classVar;
  static returnType classMethod({paramlist}) {
  …
  }

  如果在聲明時(shí)不用static 關(guān)鍵字修飾,則聲明為實(shí)例變量和實(shí)例方法。
  1) 實(shí)例變量和類(lèi)變量
  每個(gè)對(duì)象的實(shí)例變量都分配內(nèi)存,通過(guò)該對(duì)象來(lái)訪問(wèn)這些實(shí)例變量,不同的實(shí)例變量是不同的。
  類(lèi)變量?jī)H在生成第一個(gè)對(duì)象時(shí)分配內(nèi)存,所有實(shí)例對(duì)象共享同一個(gè)類(lèi)變量,每個(gè)實(shí)例對(duì)象對(duì)類(lèi)變量的改變都會(huì)影響到其它的實(shí)例對(duì)象。類(lèi)變量可通過(guò)類(lèi)名直接訪問(wèn),無(wú)需先生成一個(gè)實(shí)例對(duì)象,也可以通過(guò)實(shí)例對(duì)象訪問(wèn)類(lèi)變量。

  2) 實(shí)例方法和類(lèi)方法
  實(shí)例方法可以對(duì)當(dāng)前對(duì)象的實(shí)例變量進(jìn)行操作,也可以對(duì)類(lèi)變量進(jìn)行操作,實(shí)例方法由實(shí)例對(duì)象調(diào)用。
  但類(lèi)方法不能訪問(wèn)實(shí)例變量,只能訪問(wèn)類(lèi)變量。類(lèi)方法可以由類(lèi)名直接調(diào)用,也可由實(shí)例對(duì)象進(jìn)行調(diào)用。類(lèi)方法中不能使用this或super關(guān)鍵字。

  例3-7 是關(guān)于實(shí)例成員和類(lèi)成員的例子。

【例3-7】
  class Member {
    static int classVar;
    int instanceVar;
    static void setClassVar(int i) {
     classVar=i;
     // instanceVar=i; // 類(lèi)方法不能訪問(wèn)實(shí)例變量
    }
    static int getClassVar()
     { return classVar; }
    void setInstanceVar(int i)
     { classVar=i; //實(shí)例方法不但可以訪問(wèn)類(lèi)變量,也可以實(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());
     }
    }

    運(yùn)行結(jié)果



  ◇ 類(lèi)java.lang.Object
  類(lèi)java.lang.Object處于java開(kāi)發(fā)環(huán)境的類(lèi)層次的根部,其它所有的類(lèi)都是直接或間接地繼承了此類(lèi)。該類(lèi)定義了一些最基本的狀態(tài)和行為。下面,我們介紹一些常用的方法。

  equals() :比較兩個(gè)對(duì)象(引用)是否相同。
  getClass():返回對(duì)象運(yùn)行時(shí)所對(duì)應(yīng)的類(lèi)的表示,從而可得到相應(yīng)的信息。
  toString():用來(lái)返回對(duì)象的字符串表示。
  finalize():用于在垃圾收集前清除對(duì)象。
  notify(),notifyAll(),wait():用于多線程處理中的同步。

3.2.4抽象類(lèi)和接口

 1. 抽象類(lèi)

  java語(yǔ)言中,用abstract 關(guān)鍵字來(lái)修飾一個(gè)類(lèi)時(shí),這個(gè)類(lèi)叫做抽象類(lèi),用abstract 關(guān)鍵字來(lái)修飾一個(gè)方法時(shí),這個(gè)方法叫做抽象方法。格式如下:
  abstract class abstractClass{ …} //抽象類(lèi)
  abstract returnType abstractMethod([paramlist]) //抽象方法

  抽象類(lèi)必須被繼承,抽象方法必須被重寫(xiě)。抽象方法只需聲明,無(wú)需實(shí)現(xiàn);抽象類(lèi)不能被實(shí)例化,抽象類(lèi)不一定要包含抽象方法。若類(lèi)中包含了抽象方法,則該類(lèi)必須被定義為抽象類(lèi)。

 2. 接口

  接口是抽象類(lèi)的一種,只包含常量和方法的定義,而沒(méi)有變量和方法的實(shí)現(xiàn),且其方法都是抽象方法。它的用處體現(xiàn)在下面幾個(gè)方面:
  ◇ 通過(guò)接口實(shí)現(xiàn)不相關(guān)類(lèi)的相同行為,而無(wú)需考慮這些類(lèi)之間的關(guān)系。
  ◇ 通過(guò)接口指明多個(gè)類(lèi)需要實(shí)現(xiàn)的方法。
  ◇ 通過(guò)接口了解對(duì)象的交互界面,而無(wú)需了解對(duì)象所對(duì)應(yīng)的類(lèi)。

  1)接口的定義
  接口的定義包括接口聲明和接口體。
  接口聲明的格式如下:
  [public] interface interfaceName[extends listOfSuperInterface] { … }
   extends 子句與類(lèi)聲明的extends子句基本相同,不同的是一個(gè)接口可有多個(gè)父接口,用逗號(hào)隔開(kāi),而一個(gè)類(lèi)只能有一個(gè)父類(lèi)。

  接口體包括常量定義和方法定義
  常量定義格式為:type NAME=value; 該常量被實(shí)現(xiàn)該接口的多個(gè)類(lèi)共享; 具有public ,final, static的屬性。
  方法體定義格式為:(具有 public和abstract屬性)
  returnType methodName([paramlist]);

  2)接口的實(shí)現(xiàn)
  在類(lèi)的聲明中用implements子句來(lái)表示一個(gè)類(lèi)使用某個(gè)接口,在類(lèi)體中可以使用接口中定義的常量,而且必須實(shí)現(xiàn)接口中定義的所有方法。一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,在implements子句中用逗號(hào)分開(kāi)。

  3) 接口類(lèi)型的使用
  接口作為一種引用類(lèi)型來(lái)使用。任何實(shí)現(xiàn)該接口的類(lèi)的實(shí)例都可以存儲(chǔ)在該接口類(lèi)型的變量中,通過(guò)這些變量可以訪問(wèn)類(lèi)所實(shí)現(xiàn)的接口中的方法。

3.2.5 內(nèi)部類(lèi)

 1. 內(nèi)部類(lèi)的定義和使用:

  內(nèi)部類(lèi)是在一個(gè)類(lèi)的內(nèi)部嵌套定義的類(lèi),它可以是其它類(lèi)的成員,也可以在一個(gè)語(yǔ)句塊的內(nèi)部定義,還可以在表達(dá)式內(nèi)部匿名定義。
  內(nèi)部類(lèi)有如下特性:

  ◇ 一般用在定義它的類(lèi)或語(yǔ)句塊之內(nèi),在外部引用它時(shí)必須給出完整的名稱(chēng).名字不能與包含它的類(lèi)名相同。
  ◇ 可以使用包含它的類(lèi)的靜態(tài)和實(shí)例成員變量,也可以使用它所在方法的局部變量。
  ◇ 可以定義為abstract。
  ◇ 可以聲明為private或protected。
  ◇ 若被聲明為static,就變成了頂層類(lèi),不能再使用局部變量。
  ◇ 若想在Inner Class中聲明任何static成員,則該Inner Class必須聲明為static。

  例3-8 是一個(gè)說(shuō)明內(nèi)部類(lèi)如何使用的例子,其中,定義了兩個(gè)內(nèi)部類(lèi):MouseMotionHandler和MouseEventHandler,分別用來(lái)處理鼠標(biāo)移動(dòng)事件和鼠標(biāo)點(diǎn)按事件。

【例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);
      }
    }
  }

  同學(xué)們可以運(yùn)行一下這個(gè)程序,看一看它的運(yùn)行結(jié)果。當(dāng)你將鼠標(biāo)移入frame時(shí),文本框中會(huì)出現(xiàn):"The mouse entered";當(dāng)你在frame中拖曳鼠標(biāo)時(shí),文本框中會(huì)出現(xiàn):"Mouse dragging:X=64 Y=117";當(dāng)鼠標(biāo)離開(kāi)文本框時(shí),文本框中出現(xiàn):"The mouse left the building"。

 2. 匿名類(lèi)的定義和使用:

  匿名類(lèi)是一種特殊的內(nèi)部類(lèi),它是在一個(gè)表達(dá)式內(nèi)部包含一個(gè)完整的類(lèi)定義。通過(guò)對(duì)例6-7中g(shù)o()部分語(yǔ)句的修改,我們可以看到匿名類(lèi)的使用情況。

  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è)匿名類(lèi),類(lèi)名沒(méi)有顯式地給出,只是該類(lèi)是
          MouseMotionHandler類(lèi)的子類(lèi)*/
           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)部類(lèi)的優(yōu)缺點(diǎn):

  ◇ 優(yōu)點(diǎn):節(jié)省編譯后產(chǎn)生的字節(jié)碼文件的大小
  ◇ 缺點(diǎn):使程序結(jié)構(gòu)不清楚

【本講小結(jié)】

  類(lèi)是Java語(yǔ)言面向?qū)ο缶幊痰幕驹兀x了一個(gè)對(duì)象的結(jié)構(gòu)和功能。 Java類(lèi)中包含成員變量和成員方法。成員變量有兩種,用static 關(guān)鍵字修飾的變量為類(lèi)變量,無(wú)static 修飾的變量為實(shí)例變量。相應(yīng)地,成員方法也有兩種,用static 修飾的為類(lèi)方法,無(wú)static修飾的為實(shí)例方法。實(shí)例方法不僅可以對(duì)當(dāng)前對(duì)象的實(shí)例變量進(jìn)行操作,也可以對(duì)類(lèi)變量進(jìn)行操作;但類(lèi)方法只能訪問(wèn)類(lèi)變量。實(shí)例變量和實(shí)例方法必須由實(shí)例對(duì)象來(lái)調(diào)用,而類(lèi)變量和類(lèi)方法不僅可由實(shí)例對(duì)象來(lái)調(diào)用,還可由類(lèi)名直接調(diào)用。Java通過(guò)在類(lèi)定義的大括號(hào)里聲明變量來(lái)把數(shù)據(jù)封裝在一個(gè)類(lèi)里,這里的變量稱(chēng)為成員變量。為了解決類(lèi)名可能相同的問(wèn)題,java 中提供包來(lái)管理類(lèi)名空間。

  封裝性、繼承性和多態(tài)性是java語(yǔ)言中面向?qū)ο蟮娜齻€(gè)特性。接口是java 語(yǔ)言中特有的數(shù)據(jù)類(lèi)型,由于接口的存在,解決了java語(yǔ)言不支持多重繼承的問(wèn)題。內(nèi)部類(lèi)是指在一個(gè)類(lèi)的內(nèi)部嵌套定義的類(lèi)。

java復(fù)習(xí)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 福建省| 西乌| 蛟河市| 剑阁县| 潼关县| 沽源县| 卢湾区| 本溪| 叶城县| 姜堰市| 甘谷县| 醴陵市| 丰镇市| 盐边县| 芜湖市| 天气| 建阳市| 韩城市| 凉山| 彭泽县| 汤阴县| 秀山| 五峰| 曲周县| 天长市| 峨眉山市| 青铜峡市| 江华| 边坝县| 万荣县| 彰化市| 阜康市| 东源县| 高唐县| 南雄市| 漠河县| 会宁县| 汕尾市| 安图县| 尼玛县| 乌兰察布市|