最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java方法及this關(guān)鍵字原理分析詳解

 更新時間:2021年10月15日 11:45:12   作者:spring小楊  
本篇文章主要講解了對java方法和this關(guān)鍵字的用法及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

java類的方法,我特別喜歡《java編程思想》里面的描述,這本書說java類之間的相互通信是通過消息。比如顧客類的對象調(diào)用一個eat方法,可以看成是我們向顧客類發(fā)送了一條消息,命令他去吃飯。

步驟1 、給顧客增加一個吃飯的方法

假設(shè)我們有一個顧客類:

class Customer {
	String name;		// 客戶姓名
	String sex;		//性別
	String birthDate;	//生日
	String phoneNumber;	//電話號碼
        int status;	//客戶狀態(tài)(1:正常,2:不正常)
        void eat(){
           System.out.println("eating...");
        }
  
}

void代表方法沒有返回值。

步驟 2 、 沒有加static的屬性和方法,一定需要先new對象

這是一句口訣,new的意思是新建一個對象,Customer類只是一個聲明式的東西,不是真實(shí)存在的對象。
只要你沒有加static,就必須要在運(yùn)行的時候創(chuàng)建了對象,才可以使用!

說得武斷一點(diǎn),只要你沒有加static,你要運(yùn)行eat方法,就必須要new一個對象。

至于為什么,現(xiàn)在先不管,就這么強(qiáng)記一下吧。

步驟 3 、 用new出來的對象去執(zhí)行eat方法

class Demo {
   public static void main(String[] args){
		Customer c = new Customer();
                c.eat();  
   }
}

運(yùn)行,就可以看到eat方法被調(diào)用了。

步驟 4 、 怎么理解c.eat()

c是顧客對象的一個引用,或者叫指針。c就是一個標(biāo)記,本身不會保存顧客對象的數(shù)據(jù),但是我們操作c,就和操作顧客對象是一樣的。

這行代碼代表我們向這個顧客發(fā)送了一條吃飯消息,顧客很聰明的,一下子就懂了,于是他就用一個句點(diǎn) . 加上eat(方法名),再打一個圓括號的方式,執(zhí)行了這個方法。

這是一次成功的通訊。

步驟 5 、 消息接受器

一個類里面的方法,我們可以把它稱為​​消息接收器,這樣非常有利于理解。

步驟 6 、 如果有兩個顧客?

問個問題,如果有兩個顧客,一個叫亞瑟,一個叫安琪拉。那么他們調(diào)用的eat方法是相同的還是不同的。

如果這個出面試題,是很有區(qū)分度的。

步驟 7 、 答案

答案是相同的方法,沒想到吧。
原因是類加載器把class文件加載到虛擬機(jī),內(nèi)存的劃分會把類的所有方法都放到一個叫做方法區(qū)的地方。不管你new多少個對象,調(diào)用的都是同一個方法。因?yàn)槿绻忝縩ew一個對象,都專門開辟一個內(nèi)存空間來存放方法的話,未免也太浪費(fèi)了。

現(xiàn)在就有一個新的問題,既然方法是同一份,我怎么知道是誰呢?

步驟 8 、其實(shí)有個this

事情的真相是這樣的…
Demo.java被javac命令編譯成Demo.class和Customer.class,然后運(yùn)行的時候,首先是類加載器去加載Demo.class,發(fā)現(xiàn)還用到了Customer.class,于是順便把Customer.class也加載了。

在這個例子中,JVM里面有兩個地方需要我們關(guān)注,一個是堆,一個是方法區(qū)。

什么是堆?堆是一塊存放對象的區(qū)域,你每次new一個對象,這個對象就是放在堆里面。比如有這樣的代碼:

class Demo {
   public static void main(String[] args){
		Customer c1 = new Customer();
		Customer c2 = new Customer();
		c1.name = "亞瑟";
		c2.name = "安其拉";
   }
}

我們new了兩個對象,其中c1和c2是他們的引用,這兩個對象是放在堆里面的。

在這里插入圖片描述

而eat方法,是放在方法區(qū),只有一份。

在這里插入圖片描述

然后重頭戲來了,當(dāng)你用其中某一個對象去調(diào)用eat方法的時候,其實(shí)會傳過去一個this。

c1.eat();

this會神不知鬼不覺地作為eat方法的參數(shù),傳入eat方法。
每一個對象都有一個this,this并不是你設(shè)置的某個屬性,而是java給每一個類都設(shè)置的標(biāo)記,你察覺不到它的存在,但是它一直都在。

在這里插入圖片描述

步驟 9 、 在eat方法里面直接使用this

我們在eat方法里面直接使用this,就是這樣的:

void eat(){
   System.out.println(this.name + " eating...");
}

效果:

在這里插入圖片描述

其實(shí),它的底層是這樣的,雖然我們不能這么寫:

void eat(this){
   System.out.println(this.name + " eating...");
}

我們在方法里面調(diào)用某個變量,這個變量要么就是參數(shù)傳進(jìn)來的,要么就是這個類的屬性,這個你同意不?基于這個常理,這個this不是我們定義的屬性,那么只能是參數(shù)傳進(jìn)來的。只不過,這個過程是JVM做的,我們察覺不到。

步驟 10 、 構(gòu)造方法

每一個類都有構(gòu)造方法,寫法是這樣的。

public Customer(){
	
}

這是空的構(gòu)造方法,你不寫也沒事,就算不寫也會有這么一個方法。構(gòu)造方法的作用就是在你new對象的時候,直接調(diào)用。

記住一個口訣:

1.類名打括號 = 調(diào)用構(gòu)造方法,左邊一定會有個new。
2.方法名打括號 = 調(diào)用這個方法,默認(rèn)傳入一個this(沒有static的情況)

3.方法名打括號 = 調(diào)用這個方法,不傳入this(有static的情況)

​現(xiàn)在再回過頭來看new的語句,是不是對上了?

Customer c1 = new Customer();

步驟 11 、 總結(jié):this的意義是什么?

因?yàn)榉椒ㄊ仟?dú)一份,所有類的對象共享這些方法,JVM為了搞清楚到底是誰去調(diào)用某個方法,就在每一個類里面維護(hù)一個this。當(dāng)類被實(shí)例化(就是new的時候),這個this就指向這個對象,然后在調(diào)用方法的時候,隱式地傳入this,就可以在那個方法中獲取到當(dāng)前真實(shí)對象的數(shù)據(jù)了。

就有點(diǎn)像什么呢,有點(diǎn)像花名。

什么叫花名,比如小區(qū)的物業(yè)會設(shè)置一個花名,他們對外會宣稱,管理1-10棟的物業(yè)管家的名字是小芳,這個小芳就是花名。這是一個虛擬的名字,業(yè)主也只知道物業(yè)管家是小芳,但是小芳可能今天是張三,明天是李四。張三李四都離職了,王五成為物業(yè)管家,對外的說法也是他叫管家小芳。

物業(yè)設(shè)置管家這個職位,并不知道究竟誰來做,于是先設(shè)置好,管家就叫做小芳。小芳就相當(dāng)于this,只有等到張三來任職了,這個this就是張三。張三跑路,李四來了,這個this就是李四。

步驟 12 、 道理我都懂,那static又是什么?

我們已經(jīng)不止一次提到static了,static到底是啥啊,別急,下節(jié)我們來分享,先把這一節(jié)的知識點(diǎn)消化一下吧。

步驟 13 、 本節(jié)完整源碼

class Customer {
	String name;		// 客戶姓名
	String sex;		//性別
	String birthDate;	//生日
	String phoneNumber;	//電話號碼
	int status;	        //客戶狀態(tài)(1:正常,2:不正常)
	public Customer(){
		
	}
	void eat(){
	   System.out.println(this.name + " eating...");
	}
}
class Vip {
}
class Demo {
   public static void main(String[] args){
		Customer c1 = new Customer();
		Customer c2 = new Customer();
		c1.name = "亞瑟";
		c2.name = "安其拉";
		c1.eat();
   }
}

視頻講解:

Java對this的理解

Java中關(guān)于成員方法的講解

以上就是java方法及this關(guān)鍵字原理分析詳解的詳細(xì)內(nèi)容,更多關(guān)于java方法及this關(guān)鍵字的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot項(xiàng)目中使用Groovy腳本的示例代碼

    SpringBoot項(xiàng)目中使用Groovy腳本的示例代碼

    本文主要介紹了SpringBoot項(xiàng)目中使用Groovy腳本的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Spring中的異步方法@Async失效的原因詳解

    Spring中的異步方法@Async失效的原因詳解

    這篇文章主要介紹了Spring中的異步方法@Async失效的原因詳解,@Async屬于異步注解,@Async放在方法上標(biāo)識該方法為異步方法,異步是指進(jìn)程不需要一直等待下去,而是繼續(xù)執(zhí)行下面的操作,不管其他進(jìn)程的狀態(tài),需要的朋友可以參考下
    2024-01-01
  • 淺談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組

    淺談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組

    下面小編就為大家?guī)硪黄獪\談java中的一維數(shù)組、二維數(shù)組、三維數(shù)組、多維數(shù)組。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別

    淺談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別

    下面小編就為大家?guī)硪黄獪\談Java異常的Exception e中的egetMessage()和toString()方法的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決

    關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決

    這篇文章主要介紹了關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java實(shí)現(xiàn)順序棧原理解析

    Java實(shí)現(xiàn)順序棧原理解析

    這篇文章主要介紹了Java實(shí)現(xiàn)順序棧原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢

    IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • IDEA項(xiàng)目代碼上傳gitlab遠(yuǎn)程倉庫過程圖解

    IDEA項(xiàng)目代碼上傳gitlab遠(yuǎn)程倉庫過程圖解

    這篇文章主要介紹了IDEA項(xiàng)目代碼上傳gitlab遠(yuǎn)程倉庫過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • idea使用Vim的技巧大全分享

    idea使用Vim的技巧大全分享

    vim是一個高度可配置的文本編輯器,非常穩(wěn)定,可以高效的創(chuàng)建任何文本、持久的、多級撤銷樹、支持?jǐn)?shù)百種變成語言和格式、與許多工具集成,本文給大家分享了idea使用Vim的技巧大全,需要的朋友可以參考下
    2024-05-05
  • 舉例講解Java中synchronized關(guān)鍵字的用法

    舉例講解Java中synchronized關(guān)鍵字的用法

    這篇文章主要介紹了Java中synchronized關(guān)鍵字的用法,針對synchronized修飾方法的使用作出了簡單講解和演示,需要的朋友可以參考下
    2016-04-04

最新評論

河源市| 西吉县| 商丘市| 彭山县| 荔波县| 清水县| 响水县| 建湖县| 遵化市| 仁布县| 古丈县| 扬州市| 庆城县| 革吉县| 兴和县| 澄江县| 广昌县| 游戏| 西和县| 南昌市| 涞源县| 海口市| 白山市| 察隅县| 宝山区| 芦山县| 安国市| 射阳县| 南华县| 清水河县| 衡阳市| 朝阳市| 邵阳市| 泾阳县| 绥中县| 郑州市| 遵义县| 德令哈市| 遵义市| 略阳县| 清原|