1. 程式人生 > >一張圖搞定Java面向物件

一張圖搞定Java面向物件

剛開始學習Java的時候,一個人跌跌撞撞摸索著往前走,很多東西理解的也懵懵懂懂,後來實踐的多了,才慢慢清楚;許多東西雖然很基礎但是卻很重要,是需要反覆思考和加深理解的。頭條號“一張圖學Java”,分享一些歸納總結後的技術乾貨,一張圖能搞定的事,絕對不長篇大論。

大家都知道,Java面向物件是Java的一個核心,也是初學者的一個難點,所以我們從這裡開始,Let’s go !

一張圖搞定Java面向物件

Java面向物件

面向物件(Oriented Object)

是相對於面向過程而言的,過程其實就是函式,物件是將函式和屬性進行了封裝。

(1)將複雜的事情簡單化。

(2)面向物件將以前的過程中的執行者,變成了指揮者。

(3)面向物件思想是符合人們思考習慣的一種思想。

面向物件和麵向過程區別

- 面向過程:事物比較簡單,可以用線性的思維去解決。

- 面向物件:事物比較複雜,使用簡單的線性思維無法解決。

- 共同點:都是解決實際問題的一種思維方式。解決複雜問題,通過面向物件方式便於我們從巨集觀上把握事物之間複雜的關係,方便我們分析整個系統;具體到微觀操作,仍然使用面向過程方式來處理。

物件

接收訊息的實體,一切皆為物件,物件都有屬性和行為,物件都屬於某個類,每個物件都是獨一無二的。

建立物件的藍圖和模板

類的屬性:資料抽象

類的方法:行為抽象 

構造器(構造方法)

介面

抽象方法的集合

(1)作用:

- 能力,實現一個介面就代表具備了某方面的能力。

- 約定,一個類實現了介面就必須實現介面中的所有抽象方法否則要被宣告為抽象類。

- 角色,一個類可以實現多個介面來扮演多種角色

(2)介面之間可以繼承而且支援多重繼承

(3)從Java 8開始介面中的方法允許有預設實現

(4)常見的介面用法

- 單方法介面(函式式介面):Lambda表示式、@FunctionalInterface

- 標識性介面

- 普通介面

- 常量介面(介面最不正確的用法)

Java面嚮物件語言的三大特點

- 繼承:從已有類建立新類的過程。

父類(超類/基類):提供繼承資訊的類

子類(派生類):得到繼承資訊的類

- 封裝:隱藏一切可隱藏的實現細節提供簡單的程式設計介面。私有屬性,公有方法。好處:將變化隔離;便於使用;提高重用性,安全性。

- 多型:

方法重寫:子類對父類的方法給出自己的實現版本。

物件造型:用父型別的引用去引用子類物件。

成員

定義在類中。成員有兩種:

(1)成員變數:其實對應的就是事物的屬性。

(2)成員函式:其實對應的就是事物的行為。

區域性變數和成員變數的區別

(1)成員變數直接定義在類中。

區域性變數定義在方法中,引數上,語句中。

(2)成員變數在這個類中有效。

區域性變數只在自己所屬的大括號內有效,大括號結束,區域性變數失去作用域。

(3)成員變數定義在堆記憶體中,隨著物件的產生而存在,消失而消失。

區域性變數存在於棧記憶體中,隨著所屬區域的執行而存在,結束而釋放。

建構函式

用於給物件進行初始化 ,函式中的一種。建構函式是在物件建立時被呼叫的,而且 初始化動作只執行一次 。

特點:該函式的名稱和所在類的名稱相同。不需要指定返回值型別。該函式沒有具體的返回值。

注意:在定義一個類的時候,如果沒有定義一個建構函式,系統會自動生成一個無參建構函式,以便於該類物件的建立和初始化。如果類中自定了建構函式,那麼預設的建構函式沒有了。如果一個類中有多個建構函式,這些建構函式是以過載體現的。

構造程式碼塊和建構函式的區別

構造程式碼塊:是給所有的物件進行初始化 ,只要物件一建立就會呼叫這個程式碼塊。

建構函式:是給與之對應的物件進行初始化。

建立一個物件記憶體中執行過程

Person p = new Person();

(1)將硬碟中指定位置的Person.class檔案載入進記憶體。

(2)執行main方法時,在棧記憶體中開闢了main方法的空間(壓棧-進棧),然後在main方法的棧區分配了一個變數P。

(3)new。在堆記憶體中開闢一個實體空間,分配了一個記憶體首地址值。

(4)在該實體空間中進行屬性的空間分配,並進行了預設初始化。

(5)對空間中的屬性進行顯示初始化。

(6)進行實體的構造程式碼塊初始化。

(7)呼叫該實體對應的建構函式,進行建構函式初始化。

(8)將首地址賦值給p,p變數就引用了該實體。(指向了該物件)

this關鍵字

代表物件。就是所在函式所屬物件的引用。哪個物件呼叫了this所在的函式,this就代表哪個物件。

this是方法(除靜態方法外)中存在的隱式引數,所以在方法中使用this。

普通方法中,this總是指向呼叫該方法的物件。this.xx; (呼叫的是成員屬性和成員方法)

構造方法中,this總是指向正要初始化的物件。this(...); (呼叫本類對應引數的建構函式)

注意:

(1)this呼叫建構函式,必須定義在建構函式的第一行。否則編譯失敗。

(2)this不能用於static修飾的方法。

static關鍵字

關鍵字,是一個修飾符,用於修飾成員(成員變數和成員函式)

在類中,用static宣告的成員變數為靜態變數,或者叫做:類屬性,類變數, 從屬於類,給物件分配的記憶體裡沒有。

它為類的公用變數,屬於類,被該類的所有例項共享,在類被載入時被顯示初始化,

對於該類的所有物件來說,static成員變數只有一份。被該類的所有物件共享。

可以使用“物件.類屬性”來呼叫。不過,一般都是用“類名.類屬性”。

static變數置於方法區中。

用static宣告的方法為靜態方法。

類名.方法名的方式呼叫。

在呼叫該方法時,不會將物件的引用傳遞給它,所以在static方法中,不可訪問非static的成員。

在靜態方法中,不能是用this和supper關鍵字。

成員變數和靜態變數的區別

(1)成員變數所屬與物件,所以也稱為例項變數。

靜態變數所屬於類,所以也稱為類變數。

(2)成員變數存在於堆記憶體中。

靜態變數存在於方法區中。

(3)成員變數隨著物件的建立而存在,隨著物件被回收而消失。

靜態變數隨著類的載入而存在,隨著類的消失而消失。

(4)成員變數只能被物件所呼叫。

靜態變數可以被物件呼叫,也可以被類名呼叫。

所以,成員變數可以稱為物件的特有資料,靜態變數稱為物件的共享資料。

靜態程式碼塊

就是一個有靜態關鍵字標示的一個程式碼塊區域。定義在類中。

作用:可以完成類的初始化 。靜態程式碼塊隨著類的載入而執行,而且只執行一次。如果和主函式在同一個類中,優先於主函式執行。

靜態程式碼塊、構造程式碼塊、建構函式同時存在時的執行順序

靜態程式碼塊-->構造程式碼塊-->建構函式。

繼承

(1)類是對物件的抽象,繼承是對某一批類的抽象,從而實現對現實世界更好的建模。

(2)提高程式碼的複用性。

(3)extends的意思是“擴充套件”。子類是父類的擴充套件。

(4)子類繼承父類,可以得到父類的全部屬性和方法(除了父類的構造方法)。

(5)Java中只有單繼承,沒有多繼承。多繼承會引起混亂,使得繼承鏈過於複雜,系統難於維護。

(6)Java中的多繼承,可以通過介面來實現。

(7)java.lang.Object是所有類的超類。

過載(overload)

方法的過載是指一個類中可以定義有相同的名字,但引數不同的多個方法。呼叫時,會根據不同的引數表選擇對應的方法。

同一個類,同一個方法名。

不同:引數列表不同(型別,個數,順序不同)

只有返回值不同,不構成方法的過載。

方法重寫(override)

在子類中可以根據需要對從父類中繼承來的方法進行重寫。

重寫方法必須和被重寫方法具有相同方法名稱、引數列表和返回型別。

重寫方法不能使用比被重寫方法更嚴格的訪問許可權。(由於多型)

如果有想學習java的程式設計師,可來我們的java學習裙,818464711免費送java的視訊教程噢!小編是一名5年java開發經驗的全棧工程師,整理了一份適合18年學習的java乾貨,送給每一位想學的小夥伴,歡迎大家一起學習哦