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...