1. 程式人生 > >Java整理(二)面向物件

Java整理(二)面向物件

Java面向物件

靜態塊:用static申明,JVM載入類時執行,僅執行一次

構造塊:類中直接用{}定義,每一次建立物件時執行

執行順序優先順序:靜態塊>main()>構造塊>構造方法

所有的Java程式都以類class為組織單元

面向物件三大特徵:封裝、繼承、多型

封裝

防止該類的程式碼和資料被外部類定義的程式碼隨機訪問

成員變數一般設為private,使用setter和getter訪問

成員變數和區域性變數區別使用this關鍵字,this關鍵字只能在方法內部使用。

繼承

向上轉型:通常基類在頂部,而匯出類在其下部散開,因此轉型為一個基類就是在繼承圖中向上移動,即向上轉型,更泛化的型別。

向下轉型

:同上,向下轉為更具體的型別。

向上轉型是安全的,向下轉型幾乎是不安全的,需要進行執行時檢查,可以通過引數化型別機制解決,即泛型。

通過 extends 關鍵字可以宣告一個類是從另外一個類繼承而來的。

使用 implements 關鍵字可以變相的使java具有多繼承的特性,使用範圍為類繼承介面的情況,可以同時繼承多個介面(介面跟介面之間採用逗號分隔)。

class 子類 extends 父類 {}

所有的類都是繼承於java.lang.Object

super關鍵字:實現對父類成員的訪問,用來引用當前物件的父類。

this關鍵字:指向自己的引用。

final 關鍵字宣告類可以把類定義為不能繼承的

子類不能繼承父類的構造器

(構造方法或者建構函式),但是父類的構造器帶有引數的,則必須在子類的構造器中顯式地通過super關鍵字呼叫父類的構造器並配以適當的引數列表。

如果父類有無參構造器,則在子類的構造器中用super呼叫父類構造器不是必須的,如果沒有使用super關鍵字,系統會自動呼叫父類的無參構造器。

類如果不含公有或受保護的構造器無法被繼承。

多型

多型是同一個行為具有多個不同表現形式或形態的能力。

多型存在的三個必要條件:繼承、重寫、父類引用指向子類物件

多型的實現方式:重寫、介面、抽象類和抽象方法

重寫與過載

重寫(Override)子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!

返回型別、方法名、引數型別及個數都要與父類相同

重寫方法不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的異常。例如:父類的一個方法申明瞭一個檢查異常 IOException,但是在重寫這個方法的時候不能丟擲 Exception 異常,因為 Exception 是 IOException 的父類,只能丟擲 IOException 的子類異常。

訪問許可權不能比父類中被重寫的方法的訪問許可權更低。

當需要在子類中呼叫父類的被重寫方法時,要使用super關鍵字。

過載(Overloading) 是在一個類裡面,方法名字相同,而引數不同。返回型別可以相同也可以不同。

每個過載的方法(或者建構函式)都必須有一個獨一無二的引數型別列表。

最常用的地方就是構造器的過載。

方法的重寫(Overriding)和過載(Overloading)是java多型性的不同表現,重寫是父類與子類之間多型性的一種表現,過載可以理解成多型的具體表現形式。

抽象類

使用abstract修飾

抽象類除了不能例項化物件之外,類的其它功能依然存在,成員變數、成員方法和構造方法的訪問方式和普通類一樣。

由於抽象類不能例項化物件,所以抽象類必須被繼承,才能被使用。

abstract關鍵字同樣可以用來宣告抽象方法,抽象方法只包含一個方法名,而沒有方法體。抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括號。

如果一個類包含抽象方法,那麼該類必須是抽象類。

任何子類必須重寫父類的抽象方法,或者宣告自身為抽象類。

構造方法,類方法(用static修飾的方法)不能宣告為抽象方法。

介面

interface 介面名[extends 父介面1,父介面2,…]//可多繼承

{0~多個常量定義//變數隱式為public staticfinal

 0~多個抽象方法定義…//只能用public abstract修飾

}

class 類名 extends 父類 imlements 介面1,介面2,…{…}

介面沒有構造方法

介面支援多繼承

介面不能包含成員變數,除了static final 變數

介面型別可用來宣告一個變數,他們可以成為一個空指標,或是被繫結在一個以此介面實現的物件。

標記介面

最常用的繼承介面是沒有包含任何方法的介面。

標識介面是沒有任何方法和屬性的介面.它僅僅表明它的類屬於一個特定的型別,供其他程式碼來測試允許做一些事情。

標識介面作用:簡單形象的說就是給某個物件打個標(蓋個戳),使物件擁有某個或某些特權。

抽象類和介面的區別

1. 抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是介面中的方法不行。

2. 抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是 public static final 型別的。

3. 介面中不能含有靜態程式碼塊以及靜態方法(用 static 修飾的方法),而抽象類是可以有靜態程式碼塊和靜態方法。

4. 一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

java 1.8開始支援介面中定義靜態方法、可以有default方法。

C++

Java

虛擬函式(可被基類引用)

普通函式

純虛擬函式

抽象函式

抽象類

抽象類

虛基類

介面

包packet

Java 使用包(package)這種機制是為了防止命名衝突,訪問控制,提供搜尋和定位類(class)、介面、列舉(enumerations)和註釋(annotation)等。

package pkg1[.pkg2[.pkg3…]];                     //建立

import package1[.package2…].(classname|*);     //使用

系統中的包

       java.(功能).類

       java.lang.(類)     包含java語言基礎類

       java.util.(類)        包含java中各種工具類

       java.io.(類)          包含輸入、輸出相關功能類

構造與銷燬

l  無參構造器為預設構造器,定義構造器系統將不會自動建立預設構造器。

l  可以用this呼叫一個構造器(不能呼叫兩個,類似於super呼叫父類構造器),必須將呼叫置於最起始位置。

l  finalize()方法,虛擬機器釋放物件空間前自動呼叫該方法,不能直接呼叫,不等於解構函式,垃圾回收只與記憶體有關,儘量不使用finalize方法。

l  靜態塊:用static宣告,JVM載入類時執行,僅執行一次

構造塊:類中直接用{}定義,每一次建立物件時執行

執行順序優先順序:靜態塊>main()>構造塊>構造方法

父類靜態成員和靜態塊、子類靜態成員和靜態塊、父類構造方法、子類構造方法