?文章來源地址http://www.zghlxwxcb.cn/news/detail-757793.html
目錄
1、this引用
1.1、為什么要有this引用
1.2、什么是this引用
1.3、?this引用的特性
2、?對(duì)象的構(gòu)造及初始化
2.1、?如何初始化對(duì)象
2.2、構(gòu)造方法
2.2.1、概念?
?2.2.2、特性
?2.3、默認(rèn)初始化
?2.4、就地初始化
?
上篇:【JavaSE】基礎(chǔ)筆記 - 類和對(duì)象(上)-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/134232584?spm=1001.2014.3001.5501
接上篇繼續(xù)對(duì)類和對(duì)象的知識(shí)展開講述。
1、this引用
1.1、為什么要有this引用
先看一個(gè)日期類的例子:?
public class Date {
public int year;
public int month;
public int day;
public void setDay(int y, int m, int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "/" + month + "/" + day);
}
public static void main(String[] args) {
// 構(gòu)造三個(gè)日期類型的對(duì)象 d1 d2 d3
Date d1 = new Date();
Date d2 = new Date();
Date d3 = new Date();
// 對(duì)d1,d2,d3的日期設(shè)置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);
d3.setDay(2020,9,17);
// 打印日期中的內(nèi)容
d1.printDate();
d2.printDate();
d3.printDate();
}
}
以上代碼定義了一個(gè)日期類,然后main方法中創(chuàng)建了三個(gè)對(duì)象,并通過Date類中的成員方法對(duì)對(duì)象進(jìn)行設(shè)置和打印,代碼整體邏輯非常簡(jiǎn)單,沒有任何問題。
但是細(xì)思之下有以下兩個(gè)疑問:
1、形參名不小心與成員變量名相同:
public void setDay(int year, int month, int day){
year = year;
month = month;
day = day;
}
那函數(shù)體中到底是誰給誰賦值?成員變量給成員變量?參數(shù)給參數(shù)?參數(shù)給成員變量?成員變量參數(shù)?估計(jì)自己都搞不清楚了。
再說了,每次都需要起不同的變量名非常不方便,有沒有一種辦法可以允許我們直接使用相同的變量名,省去繁瑣的起名環(huán)節(jié)?
2、?三個(gè)對(duì)象都在調(diào)用setDate和printDate函數(shù),但是這兩個(gè)函數(shù)中沒有任何有關(guān)對(duì)象的說明,setDate和printDate函數(shù)如何知道打印的是哪個(gè)對(duì)象的數(shù)據(jù)呢?
一切讓?this?引用來揭開這層神秘的面紗。?
1.2、什么是this引用
this引用指向當(dāng)前對(duì)象(成員方法運(yùn)行時(shí)調(diào)用該成員方法的對(duì)象),在成員方法中所有成員變量的操作,都是通過該引用去訪問。只不過所有的操作對(duì)用戶是透明的,即用戶不需要來傳遞,編譯器自動(dòng)完成。
public class Date {
public int year;
public int month;
public int day;
public void setDay(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year + "/" + this.month + "/" + this.day);
}
}
?注意:this引用的是調(diào)用成員方法的對(duì)象。例如當(dāng)調(diào)用a.setDay()是,此時(shí)的this就代指a,如下圖。同理b也一樣。
1.3、?this引用的特性
- this的類型:對(duì)應(yīng)類類型引用,即哪個(gè)對(duì)象調(diào)用就是哪個(gè)對(duì)象的引用類型
- this只能在"成員方法"中使用
- 在"成員方法"中,this只能引用當(dāng)前對(duì)象,不能再引用其他對(duì)象
- this是“成員方法”第一個(gè)隱藏的參數(shù),編譯器會(huì)自動(dòng)傳遞,在成員方法執(zhí)行時(shí),編譯器會(huì)負(fù)責(zé)將調(diào)用成員方法對(duì)象的引用傳遞給該成員方法,this負(fù)責(zé)來接收。
?在代碼層面來簡(jiǎn)單演示一下隱藏參數(shù)this,注意:下圖右側(cè)中的Date類也是可以通過編譯的
2、?對(duì)象的構(gòu)造及初始化
2.1、?如何初始化對(duì)象
通過前面知識(shí)點(diǎn)的學(xué)習(xí)知道,在Java方法內(nèi)部定義一個(gè)局部變量時(shí),必須要初始化,否則會(huì)編譯失敗。
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化變量a
要讓上述代碼通過編譯,非常簡(jiǎn)單,只需在正式使用a之前,給a設(shè)置一個(gè)初始值即可。如果是對(duì)象:
public static void main(String[] args) {
Date d = new Date();
d.printDate();
d.setDate(2021,6,9);
d.printDate();
}
// 代碼可以正常通過編譯
需要調(diào)用之前寫的SetDate方法才可以將具體的日期設(shè)置到對(duì)象中。通過上述例子發(fā)現(xiàn)兩個(gè)問題:
- 每次對(duì)象創(chuàng)建好后調(diào)用SetDate方法設(shè)置具體日期,比較麻煩,那對(duì)象該如何初始化?
- 局部變量必須要初始化才能使用,為什么字段聲明之后沒有給值依然可以使用?
2.2、構(gòu)造方法
2.2.1、概念?
構(gòu)造方法(也稱為構(gòu)造器)是一個(gè)特殊的成員方法,名字必須與類名相同,在創(chuàng)建對(duì)象時(shí),由編譯器自動(dòng)調(diào)用,并且在整個(gè)對(duì)象的生命周期內(nèi)只調(diào)用一次。
public class Date {
public int year;
public int month;
public int day;
// 構(gòu)造方法:
// 名字與類名相同,沒有返回值類型,設(shè)置為void也不行
// 一般情況下使用public修飾
// 在創(chuàng)建對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,并且在對(duì)象的生命周期內(nèi)只調(diào)用一次
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
System.out.println("Date(int,int,int)方法被調(diào)用了");
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
// 此處創(chuàng)建了一個(gè)Date類型的對(duì)象,并沒有顯式調(diào)用構(gòu)造方法
Date d = new Date(2021,6,9); // 輸出Date(int,int,int)方法被調(diào)用了
d.printDate(); // 2021-6-9
}
}
?注意:構(gòu)造方法的作用就是對(duì)對(duì)象中的成員進(jìn)行初始化,并不負(fù)責(zé)給對(duì)象開辟空間。
?2.2.2、特性
- 名字必須與類名相同
- 沒有返回值類型,設(shè)置為void也不行
- 創(chuàng)建對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,并且在對(duì)象的生命周期內(nèi)只調(diào)用一次(相當(dāng)于人的出生,每個(gè)人只能出生一次)
- ?構(gòu)造方法可以重載(用戶根據(jù)自己的需求提供不同參數(shù)的構(gòu)造方法)
public class Date {
public int year;
public int month;
public int day;
// 無參構(gòu)造方法
public Date(){
this.year = 1900;
this.month = 1;
this.day = 1;
}
// 帶有三個(gè)參數(shù)的構(gòu)造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
上述兩個(gè)構(gòu)造方法:名字相同,參數(shù)列表不同,因此構(gòu)成了方法重載。
5、如果用戶沒有顯式定義,編譯器會(huì)生成一份默認(rèn)的構(gòu)造方法,生成的默認(rèn)構(gòu)造方法一定是無參的。
public class Date {
public int year;
public int month;
public int day;
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
Date d = new Date();
d.printDate();
}
}
注意:一旦用戶定義,編譯器則不再生成。
?2.3、默認(rèn)初始化
在上文中提出的第二個(gè)問題:為什么局部變量在使用時(shí)必須要初始化,而成員變量可以不用呢?
要搞清楚這個(gè)過程,就需要知道 new 關(guān)鍵字背后所發(fā)生的一些事情:?
Snake si = new Snake();
在程序?qū)用嬷皇呛?jiǎn)單的一條語句,在JVM層面需要做好多事情,下面簡(jiǎn)單介紹下:
- 檢測(cè)對(duì)象對(duì)應(yīng)的類是否加載了,如果沒有加載則加載
- 為對(duì)象分配內(nèi)存空間
- 處理并發(fā)安全問題,比如:多個(gè)線程同時(shí)申請(qǐng)對(duì)象,JVM要保證給對(duì)象分配的空間不沖突
- 初始化所分配的空間,即:對(duì)象空間被申請(qǐng)好之后,對(duì)象中包含的成員已經(jīng)設(shè)置好了初始值,比如:
- 設(shè)置對(duì)象頭信息
- 調(diào)用構(gòu)造方法,給對(duì)象中各個(gè)成員賦值
?2.4、就地初始化
在聲明成員變量時(shí),就直接給出了初始值。
public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}
?
博主推薦:?
?【LeetCode力扣】42. 接雨水-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/134104222?spm=1001.2014.3001.5502
【LeetCode力扣】189 53 輪轉(zhuǎn)數(shù)組 | 最大子數(shù)組和-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/134095703?spm=1001.2014.3001.5502?
如果覺得作者寫的不錯(cuò),求給博主一個(gè)大大的點(diǎn)贊支持一下,你們的支持是我更新的最大動(dòng)力!文章來源:http://www.zghlxwxcb.cn/news/detail-757793.html
如果覺得作者寫的不錯(cuò),求給博主一個(gè)大大的點(diǎn)贊支持一下,你們的支持是我更新的最大動(dòng)力!
如果覺得作者寫的不錯(cuò),求給博主一個(gè)大大的點(diǎn)贊支持一下,你們的支持是我更新的最大動(dòng)力!
?
到了這里,關(guān)于【JavaSE】基礎(chǔ)筆記 - 類和對(duì)象(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!