您好,登錄后才能下訂單哦!
剛開始學習Java的時候,一個人跌跌撞撞摸索著往前走,很多東西理解的也懵懵懂懂,后來實踐的多了,才慢慢清楚;許多東西雖然很基礎但是卻很重要,是需要反復思考和加深理解的。頭條號“一張圖學Java”,分享一些歸納總結后的技術干貨,一張圖能搞定的事,絕對不長篇大論。
大家都知道,Java面向對象是Java的一個核心,也是初學者的一個難點,所以我們從這里開始,Let’s go !
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)
在子類中可以根據需要對從父類中繼承來的方法進行重寫。
重寫方法必須和被重寫方法具有相同方法名稱、參數列表和返回類型。
重寫方法不能使用比被重寫方法更嚴格的訪問權限。(由于多態)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。