JavaSE的類和對(duì)象你真的了解嗎
1.基本概念
首先我們需要弄清楚幾個(gè)概念:面向?qū)ο笫鞘裁础㈩愂鞘裁?、?duì)象又是什么?還是逐個(gè)來(lái)說(shuō)
1.1面向?qū)ο?/h3>
我們常說(shuō)Java是面向?qū)ο蟮恼Z(yǔ)言,C語(yǔ)言是面向過(guò)程的語(yǔ)言,那面向?qū)ο笫鞘裁?,它和面向過(guò)程的區(qū)別在哪?
面向?qū)ο笫墙鉀Q問(wèn)題的一種思想,其核心是依靠對(duì)象之間的交互來(lái)解決事情
至于面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別,假設(shè)現(xiàn)在有一道數(shù)學(xué)題:
面向過(guò)程:你自己進(jìn)行手算,你需要關(guān)注套用什么公式,如何化簡(jiǎn)、哪些條件組合可以推出什么結(jié)論等,中間有一個(gè)環(huán)節(jié)出錯(cuò)都不行
面向?qū)ο?/strong>:你把問(wèn)題給計(jì)算機(jī),讓計(jì)算機(jī)解決,我們關(guān)注的只是人和計(jì)算機(jī)這兩個(gè)對(duì)象如何交互
這么看面向?qū)ο蠛孟癖让嫦蜻^(guò)程更高級(jí),但其實(shí)二者沒(méi)有好與壞之分,它們都有自己專門的應(yīng)用場(chǎng)景,就比如數(shù)學(xué)考試的時(shí)候題目你就只能自己寫( ̄▽ ̄)
1.2類和對(duì)象
- 類:對(duì)一個(gè)實(shí)體的描述
- 對(duì)象:類的實(shí)例化
假設(shè)你要設(shè)計(jì)某個(gè)東西,類就是你所畫的圖紙,對(duì)象則是你通過(guò)圖紙?jiān)斐鰜?lái)的實(shí)物;一個(gè)類可以產(chǎn)生多個(gè)對(duì)象
2.類的定義及使用
2.1定義
在定義類的時(shí)候需要使用一個(gè)關(guān)鍵字:class
具體語(yǔ)法如下:
class ClassName { field; method; }
ClassName
:類名field
:成員變量method
:成員方法
我們現(xiàn)在定義一個(gè)類Book,里面成員變量包括書名、作者和價(jià)格,成員方法就是打印所有成員變量
文章后面的概念都會(huì)圍繞這個(gè)類來(lái)進(jìn)行講解
2.2類的實(shí)例化
在main方法中實(shí)例化一個(gè)對(duì)象用到的關(guān)鍵字:new
代碼如下:
Book book1 = new Book();
之后便可以使用“.”來(lái)訪問(wèn)類中的成員變量和成員方法,如下:
之前我們說(shuō)過(guò)Java中的變量都要初始化,類里面的成員變量也不例外,如果成員變量未初始化,那么默認(rèn)是對(duì)應(yīng)的數(shù)據(jù)類型的0值
整型變量是0,浮點(diǎn)數(shù)是0.0,布爾類型為false,引用類型為null,char為'\u0000'
3.this引用
3.1訪問(wèn)成員變量
我們現(xiàn)在往類里面再增加一個(gè)方法setBook,用這個(gè)方法來(lái)對(duì)成員變量進(jìn)行初始化
public void setBook(String name,String author,int price) { name=name; author=author; price=price; }
我們?cè)賮?lái)看一下結(jié)果:
為什么全部都是0值?
其原因在于方法的參數(shù)名和成員變量名相等,形參因?yàn)閿?shù)局部變量,所以程序認(rèn)為方法里面的name等變量全部都是形參
我們只需要將等號(hào)左邊的變量加上this就可以解決這個(gè)問(wèn)題
this代表的是當(dāng)前對(duì)象的引用(誰(shuí)調(diào)用了this,誰(shuí)就是當(dāng)前對(duì)象)
上圖中book1調(diào)用的setBook方法,所以 book1是當(dāng)前對(duì)象,方法中的this.name等變量就相當(dāng)于告訴程序這個(gè)不是方法的形參,而是對(duì)象book1的成員變量
3.2訪問(wèn)成員方法
這個(gè)比較好理解,就是在方法里面引用類中的其它方法,但注意一點(diǎn):引用不能成環(huán)
假設(shè)setBook里面引用了show方法,那么show方法里面就不能再引用setBook,否則就亂套了
還有一點(diǎn)需要補(bǔ)充:
上面提到過(guò)一個(gè)類可以產(chǎn)生多個(gè)對(duì)象,那么多個(gè)對(duì)象調(diào)用同一個(gè)方法,程序如何分辨是哪個(gè)對(duì)象調(diào)用的?
依舊是this引用
類中的方法起始都有一個(gè)隱式的this參數(shù),通過(guò)this知道是哪個(gè)對(duì)象調(diào)用的方法,也就是說(shuō)setBook方法其實(shí)是有4個(gè)參數(shù),如下:
public void setBook(Book this,String name,String author,int price) { this.name=name; this.author=author; this.price=price; }
除了訪問(wèn)成員方法外,this還可以調(diào)用本類其它構(gòu)造方法,這一點(diǎn)在構(gòu)造方法中再介紹
3.3this引用的特性
1.只能在成員方法中使用
2.是成員方法的第一個(gè)隱藏的參數(shù)
3.在成員方法中只能引用當(dāng)前對(duì)象(在對(duì)象Book1中使用this就只能引用Book1,不能引用對(duì)象Book2)
4.為對(duì)應(yīng)類的類型引用,即哪個(gè)對(duì)象調(diào)用就是哪個(gè)對(duì)象的引用類型
4.構(gòu)造方法
構(gòu)造方法也是成員方法,但它比較特殊,對(duì)象的初始化除了在main方法中使用“.”一個(gè)一個(gè)初始化外還可以使用構(gòu)造方法
在實(shí)例化一個(gè)對(duì)象的時(shí)候一定會(huì)經(jīng)過(guò)兩個(gè)步驟:
- 分配內(nèi)存
- 調(diào)用合適的構(gòu)造方法
如果用戶沒(méi)有寫構(gòu)造方法,編譯器會(huì)默認(rèn)提供一個(gè)不帶參數(shù)的構(gòu)造方法,寫了就調(diào)用用戶自己寫的構(gòu)造方法
4.1構(gòu)造方法的特點(diǎn)
- 方法名要和類名相同
- 沒(méi)有返回值,即使是寫void也不行
- 在整個(gè)對(duì)象的聲明周期內(nèi)只能調(diào)用一次
- 可以重載
我們寫一個(gè)構(gòu)造方法如下:
public Book(String name, String author, int price) { this.name = name; this.author = author; this.price = price; }
那么初始化對(duì)象如下:
4.2this在構(gòu)造方法中使用
上面提到構(gòu)造方法可以重載,那么我們?cè)賹懸粋€(gè)沒(méi)有參數(shù)的構(gòu)造方法
public Book() { }
this在構(gòu)造方法中可以調(diào)用其它的構(gòu)造方法,比如我在沒(méi)有參數(shù)的構(gòu)造方法中調(diào)用上面的有三個(gè)參數(shù)的構(gòu)造方法
注意:
- this同樣不能成環(huán)
- this必須放在構(gòu)造方法的第一行
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳細(xì)講解springboot如何實(shí)現(xiàn)異步任務(wù)
異步:異步與同步相對(duì),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者在沒(méi)有得到結(jié)果之前,就可以繼續(xù)執(zhí)行后續(xù)操作。也就是說(shuō)無(wú)論異步方法執(zhí)行代碼需要多長(zhǎng)時(shí)間,跟主線程沒(méi)有任何影響,主線程可以繼續(xù)向下執(zhí)行2022-04-04教你快速學(xué)會(huì)JPA中所有findBy語(yǔ)法規(guī)則
這篇文章主要介紹了教你快速學(xué)會(huì)JPA中所有findBy語(yǔ)法規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11IDEA使用GsonFormat完成JSON和JavaBean之間的轉(zhuǎn)換
這篇文章主要介紹了IDEA使用GsonFormat完成JSON和JavaBean之間的轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Spring編程式和聲明式事務(wù)實(shí)例講解小結(jié)
這篇文章主要介紹了Spring編程式和聲明式事務(wù)實(shí)例講解小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總
這篇文章主要介紹了Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06淺析如何在SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏
脫敏是指在不改變?cè)瓟?shù)據(jù)結(jié)構(gòu)的前提下,通過(guò)某種方式處理數(shù)據(jù),使數(shù)據(jù)不能直接暴露用戶的真實(shí)信息,下面我們就來(lái)看看SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏的具體方法吧2024-03-03使用JAVA8 filter對(duì)List多條件篩選的實(shí)現(xiàn)
這篇文章主要介紹了使用JAVA8 filter對(duì)List多條件篩選的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03