當前位置:編程學習大全網 - 編程語言 - Java 面向對象理解?

Java 面向對象理解?

 java語言中有三個典型的面向對象的特性:封裝性、繼承性和多態性。1. 封裝性

java語言中,對象就是對壹組變量和相關方法的封裝,其中變量表明了對象的狀態,方法表明了對象具有的行為。通過對象的封裝,實現了模塊化和信息隱藏。通過對類的成員施以壹定的訪問權限,實現了類中成員的信息隱藏。

◇ java類中的限定詞

java語言中有四種不同的限定詞,提供了四種不同的訪問權限。

1) private

類中限定為private的成員,只能被這個類本身訪問。

如果壹個類的構造方法聲明為private,則其它類不能生成該類的壹個實例。

2) default

類中不加任何訪問權限限定的成員屬於缺省的(default)訪問狀態:friend,可以被這個類本身和同壹個包中的類所訪問。

3) protected

類中限定為protected的成員,可以被這個類本身、它的子類(包括同壹個包中以及不同包中的子類)和同壹個包中的所有其他的類訪問。

4) public

類中限定為public的成員,可以被所有的類訪問。

表3-1 java中類的限定詞的作用範圍比較

同壹個類

同壹個包

不同包的子類

不同包非子類

private

*

default

*

*

protected

*

*

*

public

*

*

*

*2. 繼承性

通過繼承實現代碼復用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問權限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量。但Java不支持多重繼承,即壹個類從多個超類派生的能力。

◇ 成員變量的隱藏和方法的重寫

子類通過隱藏父類的成員變量和重寫父類的方法,可以把父類的狀態和行為改變為自身的狀態和行為。

例如:

class SuperClass{

  int x; …

  void setX( ){ x=0; } …

}

class SubClass extends SuperClass{

  int x; //隱藏了父類的變量x

  …

  void setX( ) { //重寫了父類的方法 setX()

  x=5; } ….

}

註意:子類中重寫的方法和父類中被重寫的方法要具有相同的名字,相同的參數表和相同的返回類型,只是函數體不同。

◇ super

java中通過super來實現對父類成員的訪問,super用來引用當前對象的父類。Super 的使用有三種情況:

1)訪問父類被隱藏的成員變量,如:

  super.variable;

2)調用父類中被重寫的方法,如:

  super.Method([paramlist]);

3)調用父類的構造函數,如:

  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( );  //調用父類的構造方法

   x=5;      //super( ) 要放在方法中的第壹句

   System.out.println("in SubClass :x="+x);

  }

   void doSomething( ) {

   super.doSomething( ); //調用父類的方法

   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. 多態性

在java語言中,多態性體現在兩個方面:由方法重載實現的靜態多態性(編譯時多態)和方法重寫實現的動態多態性(運行時多態)。

1) 編譯時多態

在編譯階段,具體調用哪個被重載的方法,編譯器會根據參數的不同來靜態確定調用相應的方法。

2) 運行時多態

由於子類繼承了父類所有的屬性(私有的除外),所以子類對象可以作為父類對象使用。程序中凡是使用父類對象的地方,都可以用子類對象來代替。壹個對象可以通過引用子類的實例來調用子類的方法。

◇ 重寫方法的調用原則:java運行時系統根據調用該方法的實例,來決定調用哪個方法。對子類的壹個實例,如果子類重寫了父類的方法,則運行時系統調用子類的方法;如果子類繼承了父類的方法(未重寫),則運行時系統調用父類的方法。

在例3-6中,父類對象a引用的是子類的實例,所以,java運行時調用子類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( );

   }

}

◇ 方法重寫時應遵循的原則:

1)改寫後的方法不能比被重寫的方法有更嚴格的訪問權限(可以相同)。

2)改寫後的方法不能比重寫的方法產生更多的例外。

4. 其它

◇ final 關鍵字

final 關鍵字可以修飾類、類的成員變量和成員方法,但final 的作用不同。

1) final 修飾成員變量:

final修飾變量,則成為常量,例如

final type variableName;

修飾成員變量時,定義時同時給出初始值,且以後不能被修改,而修飾局部變量時不做要求。

2) final 修飾成員方法:

final修飾方法,則該方法不能被子類重寫

final returnType methodName(paramList){

}  3) final 類:

final修飾類,則類不能被繼承

final class finalClassName{

}

◇ 實例成員和類成員

用static 關鍵字可以聲明類變量和類方法,其格式如下:

static type classVar;

static returnType classMethod({paramlist}) {

}

 如果在聲明時不用static 關鍵字修飾,則聲明為實例變量和實例方法。

1) 實例變量和類變量

每個對象的實例變量都分配內存,通過該對象來訪問這些實例變量,不同的實例變量是不同的。

類變量僅在生成第壹個對象時分配內存,所有實例對象***享同壹個類變量,每個實例對象對類變量的改變都會影響到其它的實例對象。類變量可通過類名直接訪問,無需先生成壹個實例對象,也可以通過實例對象訪問類變量。

2) 實例方法和類方法

實例方法可以對當前對象的實例變量進行操作,也可以對類變量進行操作,實例方法由實例對象調用。

但類方法不能訪問實例變量,只能訪問類變量。類方法可以由類名直接調用,也可由實例對象進行調用。類方法中不能使用this或super關鍵字。

例3-7 是關於實例成員和類成員的例子。

例3-7

class Member {

  static int classVar;

  int instanceVar;

  static void setClassVar(int i) {

   classVar=i;

   // instanceVar=i; // 類方法不能訪問實例變量

  }

  static int getClassVar()

   { return classVar; }

  void setInstanceVar(int i)

   { classVar=i; //實例方法不但可以訪問類變量,也可以實例變量

   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開發環境的類層次的根部,其它所有的類都是直接或間接地繼承了此類。該類定義了壹些最基本的狀態和行為。下面,我們介紹壹些常用的方法。

equals() :比較兩個對象(引用)是否相同。

getClass():返回對象運行時所對應的類的表示,從而可得到相應的信息。

toString():用來返回對象的字符串表示。

finalize():用於在垃圾收集前清除對象。

notify(),notifyAll(),wait():用於多線程處理中的同步。

  • 上一篇:浙江省2005年1月高等教育自學考試單片機原理及應用試題及答案
  • 下一篇:王小波竟是Geek大神?這可能是最文藝的程序員了……
  • copyright 2024編程學習大全網