您好,登錄后才能下訂單哦!
這篇文章主要介紹“java方法及this關(guān)鍵字原理是什么”,在日常操作中,相信很多人在java方法及this關(guān)鍵字原理是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java方法及this關(guān)鍵字原理是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
步驟1 、給顧客增加一個(gè)吃飯的方法
步驟 2 、 沒(méi)有加static的屬性和方法,一定需要先new對(duì)象
步驟 3 、 用new出來(lái)的對(duì)象去執(zhí)行eat方法
步驟 4 、 怎么理解c.eat()
步驟 5 、 消息接受器
步驟 6 、 如果有兩個(gè)顧客?
步驟 7 、 答案
步驟 8 、其實(shí)有個(gè)this
步驟 9 、 在eat方法里面直接使用this
步驟 10 、 構(gòu)造方法
步驟 11 、 總結(jié):this的意義是什么?
步驟 12 、 道理我都懂,那static又是什么?
步驟 13 、 本節(jié)完整源碼
假設(shè)我們有一個(gè)顧客類(lèi):
class Customer { String name; // 客戶姓名 String sex; //性別 String birthDate; //生日 String phoneNumber; //電話號(hào)碼 int status; //客戶狀態(tài)(1:正常,2:不正常) void eat(){ System.out.println("eating..."); } }
void代表方法沒(méi)有返回值。
這是一句口訣,new的意思是新建一個(gè)對(duì)象,Customer類(lèi)只是一個(gè)聲明式的東西,不是真實(shí)存在的對(duì)象。
只要你沒(méi)有加static,就必須要在運(yùn)行的時(shí)候創(chuàng)建了對(duì)象,才可以使用!
說(shuō)得武斷一點(diǎn),只要你沒(méi)有加static,你要運(yùn)行eat方法,就必須要new一個(gè)對(duì)象。
至于為什么,現(xiàn)在先不管,就這么強(qiáng)記一下吧。
class Demo { public static void main(String[] args){ Customer c = new Customer(); c.eat(); } }
運(yùn)行,就可以看到eat方法被調(diào)用了。
c是顧客對(duì)象的一個(gè)引用,或者叫指針。c就是一個(gè)標(biāo)記,本身不會(huì)保存顧客對(duì)象的數(shù)據(jù),但是我們操作c,就和操作顧客對(duì)象是一樣的。
這行代碼代表我們向這個(gè)顧客發(fā)送了一條吃飯消息,顧客很聰明的,一下子就懂了,于是他就用一個(gè)句點(diǎn) . 加上eat(方法名),再打一個(gè)圓括號(hào)的方式,執(zhí)行了這個(gè)方法。
這是一次成功的通訊。
一個(gè)類(lèi)里面的方法,我們可以把它稱(chēng)為消息接收器,這樣非常有利于理解。
問(wèn)個(gè)問(wèn)題,如果有兩個(gè)顧客,一個(gè)叫亞瑟,一個(gè)叫安琪拉。那么他們調(diào)用的eat方法是相同的還是不同的。
如果這個(gè)出面試題,是很有區(qū)分度的。
答案是相同的方法,沒(méi)想到吧。
原因是類(lèi)加載器把class文件加載到虛擬機(jī),內(nèi)存的劃分會(huì)把類(lèi)的所有方法都放到一個(gè)叫做方法區(qū)的地方。不管你new多少個(gè)對(duì)象,調(diào)用的都是同一個(gè)方法。因?yàn)槿绻忝縩ew一個(gè)對(duì)象,都專(zhuān)門(mén)開(kāi)辟一個(gè)內(nèi)存空間來(lái)存放方法的話,未免也太浪費(fèi)了。
現(xiàn)在就有一個(gè)新的問(wèn)題,既然方法是同一份,我怎么知道是誰(shuí)呢?
事情的真相是這樣的…
Demo.java被javac命令編譯成Demo.class和Customer.class,然后運(yùn)行的時(shí)候,首先是類(lèi)加載器去加載Demo.class,發(fā)現(xiàn)還用到了Customer.class,于是順便把Customer.class也加載了。
在這個(gè)例子中,JVM里面有兩個(gè)地方需要我們關(guān)注,一個(gè)是堆,一個(gè)是方法區(qū)。
什么是堆?堆是一塊存放對(duì)象的區(qū)域,你每次new一個(gè)對(duì)象,這個(gè)對(duì)象就是放在堆里面。比如有這樣的代碼:
class Demo { public static void main(String[] args){ Customer c1 = new Customer(); Customer c2 = new Customer(); c1.name = "亞瑟"; c2.name = "安其拉"; } }
我們new了兩個(gè)對(duì)象,其中c1和c2是他們的引用,這兩個(gè)對(duì)象是放在堆里面的。
而eat方法,是放在方法區(qū),只有一份。
然后重頭戲來(lái)了,當(dāng)你用其中某一個(gè)對(duì)象去調(diào)用eat方法的時(shí)候,其實(shí)會(huì)傳過(guò)去一個(gè)this。
c1.eat();
this會(huì)神不知鬼不覺(jué)地作為eat方法的參數(shù),傳入eat方法。
每一個(gè)對(duì)象都有一個(gè)this,this并不是你設(shè)置的某個(gè)屬性,而是java給每一個(gè)類(lèi)都設(shè)置的標(biāo)記,你察覺(jué)不到它的存在,但是它一直都在。
我們?cè)趀at方法里面直接使用this,就是這樣的:
void eat(){ System.out.println(this.name + " eating..."); }
效果:
其實(shí),它的底層是這樣的,雖然我們不能這么寫(xiě):
void eat(this){ System.out.println(this.name + " eating..."); }
我們?cè)诜椒ɡ锩嬲{(diào)用某個(gè)變量,這個(gè)變量要么就是參數(shù)傳進(jìn)來(lái)的,要么就是這個(gè)類(lèi)的屬性,這個(gè)你同意不?基于這個(gè)常理,這個(gè)this不是我們定義的屬性,那么只能是參數(shù)傳進(jìn)來(lái)的。只不過(guò),這個(gè)過(guò)程是JVM做的,我們察覺(jué)不到。
每一個(gè)類(lèi)都有構(gòu)造方法,寫(xiě)法是這樣的。
public Customer(){ }
這是空的構(gòu)造方法,你不寫(xiě)也沒(méi)事,就算不寫(xiě)也會(huì)有這么一個(gè)方法。構(gòu)造方法的作用就是在你new對(duì)象的時(shí)候,直接調(diào)用。
記住一個(gè)口訣:
1.類(lèi)名打括號(hào) = 調(diào)用構(gòu)造方法,左邊一定會(huì)有個(gè)new。
2.方法名打括號(hào) = 調(diào)用這個(gè)方法,默認(rèn)傳入一個(gè)this(沒(méi)有static的情況)
3.方法名打括號(hào) = 調(diào)用這個(gè)方法,不傳入this(有static的情況)
現(xiàn)在再回過(guò)頭來(lái)看new的語(yǔ)句,是不是對(duì)上了?
Customer c1 = new Customer();
因?yàn)榉椒ㄊ仟?dú)一份,所有類(lèi)的對(duì)象共享這些方法,JVM為了搞清楚到底是誰(shuí)去調(diào)用某個(gè)方法,就在每一個(gè)類(lèi)里面維護(hù)一個(gè)this。當(dāng)類(lèi)被實(shí)例化(就是new的時(shí)候),這個(gè)this就指向這個(gè)對(duì)象,然后在調(diào)用方法的時(shí)候,隱式地傳入this,就可以在那個(gè)方法中獲取到當(dāng)前真實(shí)對(duì)象的數(shù)據(jù)了。
就有點(diǎn)像什么呢,有點(diǎn)像花名。
什么叫花名,比如小區(qū)的物業(yè)會(huì)設(shè)置一個(gè)花名,他們對(duì)外會(huì)宣稱(chēng),管理1-10棟的物業(yè)管家的名字是小芳,這個(gè)小芳就是花名。這是一個(gè)虛擬的名字,業(yè)主也只知道物業(yè)管家是小芳,但是小芳可能今天是張三,明天是李四。張三李四都離職了,王五成為物業(yè)管家,對(duì)外的說(shuō)法也是他叫管家小芳。
物業(yè)設(shè)置管家這個(gè)職位,并不知道究竟誰(shuí)來(lái)做,于是先設(shè)置好,管家就叫做小芳。小芳就相當(dāng)于this,只有等到張三來(lái)任職了,這個(gè)this就是張三。張三跑路,李四來(lái)了,這個(gè)this就是李四。
我們已經(jīng)不止一次提到static了,static到底是啥啊,別急,下節(jié)我們來(lái)分享,先把這一節(jié)的知識(shí)點(diǎn)消化一下吧。
class Customer { String name; // 客戶姓名 String sex; //性別 String birthDate; //生日 String phoneNumber; //電話號(hào)碼 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對(duì)this的理解
Java中關(guān)于成員方法的講解
到此,關(guān)于“java方法及this關(guān)鍵字原理是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。