Java的this關(guān)鍵字的使用與方法的重載相關(guān)知識
Java this關(guān)鍵字詳解
this 關(guān)鍵字用來表示當(dāng)前對象本身,或當(dāng)前類的一個實例,通過 this 可以調(diào)用本對象的所有方法和屬性。例如:
public class Demo{ public int x = 10; public int y = 15; public void sum(){ // 通過 this 點取成員變量 int z = this.x + this.y; System.out.println("x + y = " + z); } public static void main(String[] args) { Demo obj = new Demo(); obj.sum(); } }
運行結(jié)果:
x + y = 25
上面的程序中,obj 是 Demo 類的一個實例,this 與 obj 等價,執(zhí)行 int z = this.x + this.y;,就相當(dāng)于執(zhí)行 int z = obj.x + obj.y;。
注意:this 只有在類實例化后才有意義。
使用this區(qū)分同名變量
成員變量與方法內(nèi)部的變量重名時,希望在方法內(nèi)部調(diào)用成員變量,怎么辦呢?這時候只能使用this,例如:
public class Demo{ public String name; public int age; public Demo(String name, int age){ this.name = name; this.age = age; } public void say(){ System.out.println("網(wǎng)站的名字是" + name + ",已經(jīng)成立了" + age + "年"); } public static void main(String[] args) { Demo obj = new Demo("微學(xué)苑", 3); obj.say(); } }
運行結(jié)果:
網(wǎng)站的名字是微學(xué)苑,已經(jīng)成立了3年
形參的作用域是整個方法體,是局部變量。在Demo()中,形參和成員變量重名,如果不使用this,訪問到的就是局部變量name和age,而不是成員變量。在 say() 中,我們沒有使用 this,因為成員變量的作用域是整個實例,當(dāng)然也可以加上 this:
public void say(){ System.out.println("網(wǎng)站的名字是" + this.name + ",已經(jīng)成立了" + this.age + "年"); }
Java 默認將所有成員變量和成員方法與 this 關(guān)聯(lián)在一起,因此使用 this 在某些情況下是多余的。
作為方法名來初始化對象
也就是相當(dāng)于調(diào)用本類的其它構(gòu)造方法,它必須作為構(gòu)造方法的第一句。示例如下:
public class Demo{ public String name; public int age; public Demo(){ this("微學(xué)苑", 3); } public Demo(String name, int age){ this.name = name; this.age = age; } public void say(){ System.out.println("網(wǎng)站的名字是" + name + ",已經(jīng)成立了" + age + "年"); } public static void main(String[] args) { Demo obj = new Demo(); obj.say(); } }
運行結(jié)果:
網(wǎng)站的名字是微學(xué)苑,已經(jīng)成立了3年
值得注意的是:
在構(gòu)造方法中調(diào)用另一個構(gòu)造方法,調(diào)用動作必須置于最起始的位置。
不能在構(gòu)造方法以外的任何方法內(nèi)調(diào)用構(gòu)造方法。
在一個構(gòu)造方法內(nèi)只能調(diào)用一個構(gòu)造方法。
上述代碼涉及到方法重載,即Java允許出現(xiàn)多個同名方法,只要參數(shù)不同就可以。后續(xù)章節(jié)會講解。
作為參數(shù)傳遞
需要在某些完全分離的類中調(diào)用一個方法,并將當(dāng)前對象的一個引用作為參數(shù)傳遞時。例如:
public class Demo{ public static void main(String[] args){ B b = new B(new A()); } } class A{ public A(){ new B(this).print(); // 匿名對象 } public void print(){ System.out.println("Hello from A!"); } } class B{ A a; public B(A a){ this.a = a; } public void print() { a.print(); System.out.println("Hello from B!"); } }
運行結(jié)果:
Hello from A! Hello from B!
匿名對象就是沒有名字的對象。如果對象只使用一次,就可以作為匿名對象,代碼中 new B(this).print(); 等價于 ( new B(this) ).print();,先通過 new B(this) 創(chuàng)建一個沒有名字的對象,再調(diào)用它的方法。
Java方法重載
在Java中,同一個類中的多個方法可以有相同的名字,只要它們的參數(shù)列表不同就可以,這被稱為方法重載(method overloading)。
參數(shù)列表又叫參數(shù)簽名,包括參數(shù)的類型、參數(shù)的個數(shù)和參數(shù)的順序,只要有一個不同就叫做參數(shù)列表不同。
重載是面向?qū)ο蟮囊粋€基本特性。
下面看一個詳細的實例。
public class Demo{ // 一個普通的方法,不帶參數(shù) void test(){ System.out.println("No parameters"); } // 重載上面的方法,并且?guī)Я艘粋€整型參數(shù) void test(int a){ System.out.println("a: " + a); } // 重載上面的方法,并且?guī)Я藘蓚€參數(shù) void test(int a,int b){ System.out.println("a and b: " + a + " " + b); } // 重載上面的方法,并且?guī)Я艘粋€雙精度參數(shù) double test(double a){ System.out.println("double a: " + a); return a*a; } public static void main(String args[]){ Demo obj= new Demo(); obj.test(); obj.test(2); obj.test(2,3); obj.test(2.0); } }
運行結(jié)果:
No parameters a: 2 a and b: 2 3 double a: 2.0
通過上面的實例,讀者可以看出,重載就是在一個類中,有相同的函數(shù)名稱,但形參不同的函數(shù)。重載的結(jié)果,可以讓一個程序段盡量減少代碼和方法的種類。
說明:
- 參數(shù)列表不同包括:個數(shù)不同、類型不同和順序不同。
- 僅僅參數(shù)變量名稱不同是不可以的。
- 跟成員方法一樣,構(gòu)造方法也可以重載。
- 聲明為final的方法不能被重載。
- 聲明為static的方法不能被重載,但是能夠被再次聲明。
方法的重載的規(guī)則:
- 方法名稱必須相同。
- 參數(shù)列表必須不同(個數(shù)不同、或類型不同、參數(shù)排列順序不同等)。
- 方法的返回類型可以相同也可以不相同。
- 僅僅返回類型不同不足以成為方法的重載。
方法重載的實現(xiàn):
方法名稱相同時,編譯器會根據(jù)調(diào)用方法的參數(shù)個數(shù)、參數(shù)類型等去逐個匹配,以選擇對應(yīng)的方法,如果匹配失敗,則編譯器報錯,這叫做重載分辨。
相關(guān)文章
intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享
這篇文章主要介紹了intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02全面了解JAVA_BaseDAO數(shù)據(jù)處理類
下面小編就為大家?guī)硪黄媪私釰AVA_BaseDAO數(shù)據(jù)處理類。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07Java的方法和this關(guān)鍵字如何理解與應(yīng)用
Java語言中的“方法”(Method)在其他語言當(dāng)中也可能被稱為“函數(shù)”(Function)。對于一些復(fù)雜的代碼邏輯,如果希望重復(fù)使用這些代碼,并且做到“隨時任意使用”,那么就可以將這些代碼放在一個大括號{}當(dāng)中,并且起一個名字。使用代碼的時候,直接找到名字調(diào)用即可2021-10-10PowerJob LockService方法工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob LockService方法工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01springboot啟動后和停止前執(zhí)行方法示例詳解
這篇文章主要介紹了springboot啟動后和停止前執(zhí)行方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08IntelliJ IDEA創(chuàng)建maven web項目的圖文步驟(IDEA新手適用)
這篇文章主要介紹了IntelliJ IDEA創(chuàng)建maven web項目的圖文步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03