一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java的方法和this關鍵字如何理解與應用

Java的方法和this關鍵字如何理解與應用

2022-02-15 15:48spring小楊 Java教程

Java語言中的“方法”(Method)在其他語言當中也可能被稱為“函數”(Function)。對于一些復雜的代碼邏輯,如果希望重復使用這些代碼,并且做到“隨時任意使用”,那么就可以將這些代碼放在一個大括號{}當中,并且起一個名字

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

 

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

假設我們有一個顧客類:

class Customer {
	String name;		// 客戶姓名
	String sex;		//性別
	String birthDate;	//生日
	String phoneNumber;	//電話號碼
      int status;	//客戶狀態(1:正常,2:不正常)


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

}

void代表方法沒有返回值。

 

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

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

說得武斷一點,只要你沒有加static,你要運行eat方法,就必須要new一個對象。

至于為什么,現在先不管,就這么強記一下吧。

 

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

class Demo {

 public static void main(String[] args){

		Customer c = new Customer();

              c.eat();  

 }

}

運行,就可以看到eat方法被調用了。

 

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

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

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

這是一次成功的通訊。

 

步驟 5 、 消息接受器

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

 

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

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

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

 

步驟 7 、 答案

答案是相同的方法,沒想到吧。
原因是類加載器把class文件加載到虛擬機,內存的劃分會把類的所有方法都放到一個叫做方法區的地方。不管你new多少個對象,調用的都是同一個方法。因為如果你每new一個對象,都專門開辟一個內存空間來存放方法的話,未免也太浪費了。

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

 

步驟 8 、其實有個this

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

在這個例子中,JVM里面有兩個地方需要我們關注,一個是堆,一個是方法區。

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

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

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

Java的方法和this關鍵字如何理解與應用

而eat方法,是放在方法區,只有一份。

Java的方法和this關鍵字如何理解與應用

然后重頭戲來了,當你用其中某一個對象去調用eat方法的時候,其實會傳過去一個this。

c1.eat();

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

Java的方法和this關鍵字如何理解與應用

 

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

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

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

效果:

Java的方法和this關鍵字如何理解與應用

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

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

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

 

步驟 10 、 構造方法

每一個類都有構造方法,寫法是這樣的。

public Customer(){
	
}

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

記住一個口訣:

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

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

?現在再回過頭來看new的語句,是不是對上了?

Customer c1 = new Customer();

 

步驟 11 、 總結:this的意義是什么?

因為方法是獨一份,所有類的對象共享這些方法,JVM為了搞清楚到底是誰去調用某個方法,就在每一個類里面維護一個this。當類被實例化(就是new的時候),這個this就指向這個對象,然后在調用方法的時候,隱式地傳入this,就可以在那個方法中獲取到當前真實對象的數據了。

就有點像什么呢,有點像花名。

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

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

 

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

我們已經不止一次提到static了,static到底是啥啊,別急,下節我們來分享,先把這一節的知識點消化一下吧。

 

步驟 13 、 本節完整源碼

class Customer {
	String name;		// 客戶姓名
	String sex;		//性別
	String birthDate;	//生日
	String phoneNumber;	//電話號碼
	int status;	        //客戶狀態(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();
 }
}

視頻講解:

https://www.bilibili.com/video/BV1df4y1c7Pe/

https://www.bilibili.com/video/BV1N341127CZ/

到此這篇關于Java的方法和this關鍵字如何理解與應用的文章就介紹到這了,更多相關Java 方法 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_39570751/article/details/120677774

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2021国产精品露脸在线 | 91制片厂制作传媒免费版樱花 | 色啊色 | 亚洲国产视频网站 | 99精品视频一区在线观看miya | 亚洲人的天堂男人爽爽爽 | 激情艳妇| 天堂成人在线 | 欧美添下面视频免费观看 | 亚洲四虎影院 | 女主被男主做哭失禁高h | 国产精品嫩草影院在线看 | 香蕉eeww99国产精选播放 | 亚洲一区二区三区久久精品 | 精品日韩欧美一区二区三区在线播放 | 男人的天堂在线观看入口 | 亚洲欧美综合区自拍另类 | 特黄未满14周岁毛片 | 手机看片日韩1024你懂的首页 | 免费又爽又黄禁片视频在线播放 | 果冻传媒天美传媒在线小视频播放 | 国产一级持黄大片99久久 | 国产成人+亚洲欧洲 | 亚洲香蕉伊在人在线观婷婷 | 日韩免费毛片视频杨思敏 | 国产真实一区二区三区 | 国产日韩欧美成人 | 日本成人黄色网址 | 美女张开腿黄网站免费精品动漫 | 91热国产| 亚洲人成高清毛片 | 美国玩尿眼道videos | 九九热精品免费观看 | 日本在线小视频 | 天堂久久久久va久久久久 | xx顶级欧美熟妞xxhd | 国产裸露片段精华合集链接 | 国产手机在线αⅴ片无码观看 | 天天久久影视色香综合网 | 日本人交换乱理伦片 | 久久成人国产精品一区二区 |