1. 程式人生 > >Java-Java面向對象程序設計

Java-Java面向對象程序設計

inter 來看 不同包 執行 我們 提高 應該 過程 實現

2017-10-09 17:23:52

在面向對象技術中,將客觀世界中的一個事物作為一個對象來考慮,比如有個張先生,他就是一個對象。每個對象都有自己的屬性和行為。張先生的屬性根據需要有姓名、性別、身高等,他的行為有開車,閱讀,跑步等。從程序設計的角度來看,事物的屬性可以用變量來描述,行為則用方法來反映。

一、面向對象設計的核心技術

面向對象程序設計的核心技術主要是封裝、繼承和多態性。

  • 封裝

類是封裝的基本單元。通過封裝可以隱藏類的實現細節,也可以避免對類中屬性的直接操作。可以通過類的公共接口訪問類中的變量,而不必知道這個接口的具體實現方式。只要這個方法的名字和參數不變,即使類中的變量被重新定義,或方法的代碼被修改,對類中的變量的訪問也不會受到影響。比如,你在計算機上安裝了一個聲卡,你不必知道聲卡的內部結構,也不必知道功能如何實現的,因為實現聲卡功能的繼承電路被封裝了。你只要知道聲卡應該裝在電腦主板的什麽位置,其他的設備如音箱,光驅怎樣和聲卡連接就可以了。

  • 繼承

繼承是對類的功能的重用和擴充。通過對某一個類的繼承產生一個新的子類,子類既有從某個類中繼承下來的功能,又可以自行定義自己的變量和方法,產生新的功能。

  • 多態性

多態性指的是方法的名字相同,但實現不同。即“同一接口,多個方法”。如有三個方法,分別用來計算圓、矩形、三角形面積,他們的名字可以都叫做area。

二、類的結構

Java是一種完全面向對象對程序設計語言。他所有的屬性類型和方法都封裝在類中,Java繼承了C++的有點,但放棄了那些含糊,復雜和容易出錯的特性。Java所實現的面向對象的特性,降低了程序的復雜性,實現了代碼的可重用性,提高了運行效率。

  • 類的聲明格式

[修飾符]class 類名 [extends 超類名][implements 接口名]

類主體

修飾符包含訪問權限有兩種,要麽默認,要麽public。如果在一個源文件中有多個類的話,只能有一個類的權限可以是public,其余的類的權限必須是默認。public類的名字應該和文件同名,同時main函數也要放在該類中。Java中public權限指所有的類都可以訪問,而默認的訪問權限則是指只允許同一個包的類進行訪問。

     final:final修飾的類為最終類,這種類不能被繼承。

     abstract:抽象類,不能實例化

  • 成員變量

[修飾符][static][final][transient] 變量類型 變量名;

修飾符:默認的,public,protected,private

static:靜態變量

final:常量

transient:臨時變量

  • 成員方法

[修飾符]返回類型 方法名(參數表)[throws <異常類>]

{

方法體;

}

這裏的修飾符包含訪問權限,共有四種,即:默認的,public,protected,private。

        static:靜態方法

        abstract:抽象方法(無方法體的方法)

        final:最終方法(不能被子類繼承的方法)

        throws:拋出異常

  • 訪問權限的說明

public:所有的類都能訪問

protected:不同包的子類可以訪問

默認:同一包能訪問

private:同一類可以訪問

三、對象的構造和初始化以及對象的銷毀

  • 構造方法

構造方法沒有返回值,且構造方法的名字應該和這個類一致。

例如:Date(int m,int n){...}

在創建對象的時候會自動調用相應的構造方法。

  • 對象的銷毀

對象的生命周期是指對象的創建、使用和銷毀這一過程。對象的銷毀是指當對象使用完成後,釋放對象占用的資源。

Java能自動判斷對象是否在使用,並自動銷毀不在使用的對象,收回對象所占用的資源。在這種模式下我們並不知道對象銷毀的具體時間。

此外,我們可以在程序中定義finalize()方法,使得對象在銷毀之前執行該方法。該方法的基本格式如下:

[修飾符]void finalize(){}

java提供finalize()方法,垃圾回收器準備釋放內存的時候,會先調用finalize()。

(1).對象不一定會被回收。

(2).垃圾回收不是析構函數。

(3).垃圾回收只與內存有關。

(4).垃圾回收和finalize()都是靠不住的,只要JVM還沒有快到耗盡內存的地步,它是不會浪費時間進行垃圾回收的。

四、靜態成員

類中有一種特殊的成員,他不屬於某一個單獨的對象,而是屬於整個類所有。另外,Java中static不可以用來修飾局部變量。靜態成員函數只能訪問靜態成員變量。

五、類的繼承

如果要擴展原有的程序的功能,可以對原來的類進行修改或增加一個新類,但是這樣就不符合開閉原則了。同時,也會影響原來的類的相關代碼,或者造成代碼的重復。

一種好的方法是通過繼承來重用已有的代碼,同時增加新的代碼來進行功能的擴展。

繼承是面向對象設計的重要方法,被繼承的類稱為超類,從超類派生的新類稱為子類。子類中包含兩個部分,一個是從超類中繼承下來的變量和方法,一個是自己新增加的方法和變量。

Java中只支持單重繼承,不支持多重繼承,所以一個類只能有一個超類。

  • 聲明子類

[修飾符]class 子類名 extends 超類名

{...}

子類的對象也是超類的對象,超類的對象不一定是子類的對象。

成員變量的繼承規則:子類只繼承超類中非private的部分;

     隱藏原則(hiding):子類的成員變量和超類的成員變量同名的時候,超類的成員變量被隱藏。

成員方法的繼承規則:子類只繼承超類中非private的部分;

     覆蓋原則(Override):子類的成員方法和超類的成員方法同名的時候,超類的成員方法被子類的成員方法覆蓋。

  • 子類的構造方法

在調用子類的構造方法的時候,需要先調用超類的構造方法,子類的構造方法的參數的前面幾個,是給超類的構造方法使用的。在子類的構造方法體中,使用super進行顯示的調用超類的構造方法,並將此語句放在構造方法體的最前面。如果超類中有默認的構造方法,那麽在子類的構造方法中,可以不顯示的調用超類的構造方法。

  • null,this,super

null:表示空對象,即沒有創建類的任何實例。

this:代指當前的對象,是對象的引用。訪問本類的成員,this.<變量名>,this.<方法名>,調用本類的構造方法this(參數表)

super:超類的引用,可以使用super來引用被子類屏蔽的超類的成員,super.<變量名>,super.<方法名>,調用超類的構造方法super(參數表);

六、最終類和抽象類

  • 最終類和最終方法

被final修飾的類和方法稱為最終類和最終方法,這種類無法被繼承,這種方法不會在子類中被覆蓋,也就是說子類中不能有和此方法同名的方法。

final class Last{...};

public final void printsuper(參數表){...};

  • 抽象類和抽象方法

抽象方法是必須在子類被覆蓋的方法,在聲明的時候,用關鍵字abstract將方法說明為抽象方法,並不設方法體

含有抽象方法的類為抽象類,也需要用abstract修飾,他是一種不能實例化的類。

abstract class <類名>{...abstract 方法}

proected abstract void write();

註意:對於成員方法,不能同時使用static和abstract說明,因為static不用實例化就可以調用,而abstract必須進行實例化實現。

對於類,不能同時使用final和abstract進行修飾,因為這兩種方式明顯是相反的。

七、類的多態性

多態是指同一名稱,多種實現。多態的實現主要通過重載(overloading)和覆蓋(override)來完成。

  • 重載

方法的名字相同,但參數不同(註意僅返回值不同不能算作重載),稱為重載。在執行的時候,根據參數的不同來決定執行哪個方法。

  • 覆蓋

子類和超類中有同名的方法,且參數也相同,子類中的方法將覆蓋超類的方法。

* 前期綁定和後期綁定的概念

對於方法的重載,在程序編譯的時候,根據調用語句中給出的參數,就可以決定在程序中執行時調用的版本,這種稱為編譯時的綁定,也叫做前期綁定;

對於方法的覆蓋,要在程序執行時,才能決定調用同名方法的版本,這稱為運行時的綁定,也叫做後期綁定。

八、接口

在Java中,由於不支持多重繼承,所以引入了接口的概念。一個類可以有一個超類和多個接口。Java中的面向對象編程也被戲稱為面向接口編程。足見接口的概念的重要性。

  • 接口的聲明

接口是一個特殊的類,他是由靜態常量和抽象方法組成的,並且不包含變量和方法的實現

[修飾符] interface 接口名{...}

其中修飾符可以是public或者默認訪問控制。

接口中的變量默認是static final ,且必須被賦初值。如果接口是public,那麽接口中的成員都隱含是public訪問權限。

  • 接口的實現

一個接口可以被一個類或者多個類實現。當一個類實現了一個接口,它必須實現這個接口中的所有方法,這些方法都要被說明成public。使用關鍵詞implements實現接口。

class 類名 implements 接口1,接口2...

Java-Java面向對象程序設計