【Java】面向對象詳解

1、面向對象

面向對象(Object Oriented)的基本思想是使用對象、類、繼承、封裝、多態等基本概念來進行程序設計。從現實世界中客觀存在的事物(即對象)出發來構造軟件系統,并且在系統構造中盡可能運用人類的自然思維方式。

2、對象

對象是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的方法的這一組服務組成。

類的實例化可生成一個對象,一個對象的生命周期包括三個階段:生成、使用、消除。

當不存在對一個對象的引用時,該對象成為一個無用對象。Java的垃圾收集器自動掃描對象的動態內存區,把沒有引用的對象作為垃圾收集起來并釋放。當系統內存用盡或調用System.gc()要求垃圾回收的時候,垃圾回收線程與系統同步運行。

3、類

類是具有相同屬性和方法的一組對象的集合,它為屬于該類的所有對象提供了統一的抽象描述,其內部包括屬性和方法兩個主要部分。在面向對象的編程語言中,類是一個獨立的程序單元,它應該有一個類名并包括屬性和方法兩個主要部分。

Java中的類實現包括兩個部分:類聲明和類體。

類聲明

[ public ][ abstract | final ] class className [extends superclassNmae] [implements interfaceNameList]{...}

其中,修飾符public,abstract,final 說明了類的屬性,className為類名,superclassName為類的父類的名字,interfaceNameList為類所實現的接口列表。

類體

class className{
  //成員變量
  [ public | protected | private ] [ static ] [ final ] [ transient ] [ volatile ] type variableName;
  
  //成員方法
  [ public | protected | private ] [ static ] [ final | abstract ] [ native ] [ synchronized ] returnType methodName ([paramList]) [ throws exceptionList]{
    statements
  }
}

成員變量限定詞的含義:

  • static:靜態變量(類變量)
  • final:常量
  • transient:暫時性變量,用于對象的存檔,用于對象的串行化
  • volatile:貢獻變量,用于并發線程的共享方法的實現也包括兩部分:方法聲明和方法體。

方法聲明

方法聲明中的限定詞的含義:

  • static:類方法,可通過類名直接調用
  • abstract:抽象方法,沒有方法體
  • final:方法不能被重寫
  • native:集成其他語言的方法
  • synchronized:控制多個并發線程的訪問

方法的聲明包括方法名、返回類型和外部參數。其中參數的類型可以是基本數據類型,也可以是引用數據類型。

對于基本數據類型來說,Java實現的是值得傳遞,方法接收參數的值,但不能改變參數的值。如果要改變參數的值,則用引用數據類型,因為引用數據類型傳遞給方法的數據是內存的地址,方法中對數據的操作(即改變地址)可以改變數據的值(即地址會指向不同的實例)。

方法體

方法體是對方法的實現,它包括局部變量的聲明以及所有合法的Java指令。方法體中聲明的局部變量的作用域在該方法的內部。若局部變量與類的成員變量同名,則類的成員變量被隱藏。

為了區別參數和類的成員變量,我們必須使用this。this用在一個方法中引用當前對象,它的值是調用該方法所在的對象。返回值須與返回類型一致,或者完全相同,或者是其子類。當返回類型是接口時,返回值必須實現接口。

構造方法

  • 構造方法是一個特殊的方法。Java中的每一個類都有構造方法,用來初始化該類的一個對象。
  • 構造方法具有和類同樣的名稱,而且不返回任何的數據類型。
  • 重載經常用于構造方法。
  • 構造方法只能由new運算符調用。

4、面向對象的基本特征

封裝

封裝性就是盡可能的隱藏對象內部的細節,對外形成一道邊界,只保留有限的接口和方法與外界進行交互。封裝的原則是使對象以外的部分不能隨意的訪問和操作對象的內部屬性,從而避免了外界對對象內部屬性的破壞。

可以通過對類的成員設置一定的訪問權限,實現類中成員的信息隱蔽。

  • private:類中限定為private的成員,只能被這個類的本身訪問。如果一個類的構造方法聲明為private,則其他類不能生成該類的一個實例。

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

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

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

下圖“*”表示可以訪問:

private default protected public
同一類中 * * * *
同一包中 * * *
子類 * *
全局范圍 *

繼承

子類的對象擁有父類的全部屬性與方法,稱作子類對父類的繼承。

  • Java中父類可以擁有多個子類,但是子類只能繼承一個父類,稱為單繼承。

  • 繼承實現了代碼的復用。

  • Java中所有類都是通過直接或者間接地繼承了java.lang.Object類得到的。換言之Object是Java中所有類的父類或者超類。

  • 子類不能繼承父類中訪問權限是private的成員變量和成員方法。

  • 子類可以重寫父類的方法,以及命名與父類同名的成員變量。

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

  • 訪問父類被隱藏的成員變量,如:super.variable;

  • 調用父類中被重寫的方法,如:super.Method([paramlist]);。

  • 調用父類的構造方法,如:super([paramlist]);。

多態

對象的多態性是指在父類定義的屬性或者方法被子類繼承之后,可以具有不同的數據類型或表現出不同行為。這使得同一個屬性或者方法在父類及其各個子類中具有不同的語義。例如:“幾何圖形”的“繪圖”方法,“橢圓”和“多邊形”都是“幾何圖形”的子類,其“繪圖”的方法不一樣。

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

  • 編譯時多態:在編譯階段,具體調用哪個被重載的方法,編譯器會根據參數的不同靜態(參數的類型、參數的順序、參數的個數)確定其相應的方法。(比如在構造方法和一般方法里面);子類重寫父類的方法。

  • 運行時多態:由于子類繼承了父類的所有的屬性(私有屬性除外),所有的子類對象可以作為父類對象使用。程序中凡是使用父類對象的地方,都可以用子類對象來代替。一個對象可以通過引用子類的實例來調用子類的方法。(比如Dog類和Cat類是Animal的子類,我們定義一個方法void letSleep(Animal animal){animal.sleep();},然后sleep這個父類中的方法,分別被子類重寫。那么我們向letSleep這個方法分別傳入dog(Dog類的實例)或者cat(Cat類的實例),那么該方法就會分別調用dog中的sleep()方法和cat中的sleep()方法)。

重載 (overload)

  • 方法重載是讓類以統一的方式處理不同數據類型的手段。

  • 一個類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法。

  • 返回值類型可以相同也可以不同,無法以返回值類型作為重載方法的區分標準。

重寫 (override)

  • 子類對父類的方法進行重新編寫。如果在子類中的方法與其父類有相同的方法名、返回類型和參數表,我們說該方法被重寫。

  • 如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。

  • 子類函數的訪問修飾權限不能低于父類的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • 1、面向對象 面向對象(Object Oriented)是一種程序設計方法,或者可以理解為是一種設計規范,其基本思...
    熊安安閱讀 849評論 0 1
  • 1 面向對象No6 面向對象 OO Object Oriented 編程時以對象為單元,封裝數據和邏輯,以此提...
    征程_Journey閱讀 1,172評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發和運行環境,java的開發工...
    ZaneInTheSun閱讀 2,685評論 0 11
  • 游戲改變世界PDF↓ 游戲改變世界 游戲化思維PDF↓ 游戲化思維 游戲的意義游戲化思維視頻資料↓ 視頻資源 游戲...
    姬如曉亦閱讀 1,842評論 3 2