第五章:面向?qū)ο蠡A(chǔ)——this關(guān)鍵字具帮。

本章目標(biāo)

  • 掌握this關(guān)鍵字的使用
  • 使用this調(diào)用其他構(gòu)造方法
  • 使用this表示當(dāng)前對象

1、具體內(nèi)容

1.1汪厨、表示類中的屬性

例如赃春,有如下的一道程序:

class Person{       // 定義Person類
    private String name ;       // 姓名
    private int age ;           // 年齡
    public Person(String name,int age){ // 通過構(gòu)造方法賦值
        name = name ;
        age = age ;
    }
    public String getInfo(){    // 取得信息的方法
        return "姓名:" + name + ",年齡:" + age ;
    }
};
public class ThisDemo01{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};
輸出結(jié)果:
姓名:null劫乱,年齡:0

此時聘鳞,并沒有正確的將內(nèi)容賦值給屬性。
假設(shè):現(xiàn)在要拿一根筆寫字要拂,在自己的桌子上已經(jīng)有了一根可以使用的比抠璃,之后在離自己10米遠(yuǎn)的地方也有一根筆。那么脱惰,此時你會選擇拿哪根筆寫字搏嗡?所以,此時操作的name和age實際上都是構(gòu)造方法中的拉一,跟類中的屬性完全不沾邊采盒。
所以此時,為了明確的表示出哪個是類中的屬性蔚润,此時就要加上“this.屬性名稱”的操作磅氨。
代碼改進(jìn):

class Person{       // 定義Person類
    private String name ;       // 姓名
    private int age ;           // 年齡
    public Person(String name,int age){ // 通過構(gòu)造方法賦值
        this.name = name ; // 為類中的name屬性賦值
        this.age = age ;// 為類中的age屬性賦值
    }
    public String getInfo(){    // 取得信息的方法
        return "姓名:" + name + ",年齡:" + age ;
    }
};
public class ThisDemo02{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};

在大部分操作的時候嫡纠,屬性最好都是用this.屬性的形式表示烦租。

輸出結(jié)果:
姓名:null,年齡:0

1.2除盏、使用this調(diào)用構(gòu)造方法

如果在一個類中有多個構(gòu)造方法的話叉橱,也可以利用this關(guān)鍵字互相調(diào)用。
假設(shè):現(xiàn)在有一個類中存在多個構(gòu)造方法者蠕,但是不管都少個構(gòu)造方法窃祝,最終結(jié)果都要打印一句“新對象實例化”。此時就有以下的兩種做法:

  • 按照最原始的方法完成:
class Person{       // 定義Person類
    private String name ;       // 姓名
    private int age ;           // 年齡
    public Person(){    // 無參構(gòu)造
        System.out.println("新對象實例化") ;
    }
    public Person(String name){
        System.out.println("新對象實例化") ;
        this.name = name ;
    }
    public Person(String name,int age){ // 通過構(gòu)造方法賦值
        System.out.println("新對象實例化") ;
        this.name = name ; // 為類中的name屬性賦值
        this.age = age ;// 為類中的age屬性賦值
    }
    public String getInfo(){    // 取得信息的方法
        return "姓名:" + name + "踱侣,年齡:" + age ;
    }
};
public class ThisDemo03{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};

因為以上代碼重復(fù)了粪小,現(xiàn)在只是一行,所以感覺不出來抡句,如果現(xiàn)在代碼有很多行的話探膊,以上代碼的缺陷,就立刻顯示出來了玉转。
此時突想,最好讓構(gòu)造方法間進(jìn)行互相的調(diào)用,使用this(若干參數(shù))的形式完成。

  • 使用this修改以上的代碼:
class Person{       // 定義Person類
    private String name ;       // 姓名
    private int age ;           // 年齡
    public Person(){    // 無參構(gòu)造
        System.out.println("新對象實例化") ;
    }
    public Person(String name){
        this.name = name ;
        this() ;// 調(diào)用本類中的無參構(gòu)造方法
    }
    public Person(String name,int age){ // 通過構(gòu)造方法賦值
        this(name) ;// 調(diào)用有一個參數(shù)的構(gòu)造方法
        this.age = age ;// 為類中的age屬性賦值
    }
    public String getInfo(){    // 取得信息的方法\
        this() ;// 調(diào)用本類中的無參構(gòu)造方法
        return "姓名:" + name + "猾担,年齡:" + age ;
    }
};
public class ThisDemo04{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};
輸出結(jié)果:
姓名:張三袭灯,年齡:33

注意點:在使用this關(guān)鍵字調(diào)用其他構(gòu)造方法的時候,有以下幾點限制:

  • this()調(diào)用構(gòu)造方法的語句只能放在構(gòu)造方法的首行绑嘹。
  • 在使用this調(diào)用本類中其他構(gòu)造方法的時候稽荧,至少有一個構(gòu)造方法不用this調(diào)用的。
class Person{       // 定義Person類
    private String name ;       // 姓名
    private int age ;           // 年齡
    public Person(){    // 無參構(gòu)造
        this("LXH",30) ;    // 調(diào)用有兩個參數(shù)的構(gòu)造方法
        System.out.println("新對象實例化") ;
    }
    public Person(String name){
        this() ;// 調(diào)用本類中的無參構(gòu)造方法
        this.name = name ;
    }
    public Person(String name,int age){ // 通過構(gòu)造方法賦值
        this(name) ;// 調(diào)用有一個參數(shù)的構(gòu)造方法
        this.age = age ;// 為類中的age屬性賦值
    }
    public String getInfo(){    // 取得信息的方法
        return "姓名:" + name + "工腋,年齡:" + age ;
    }
};
public class ThisDemo05{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ; // 調(diào)用構(gòu)造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};

此時構(gòu)造方法出現(xiàn)了遞歸調(diào)用姨丈,是一個錯誤的程序。

1.3擅腰、使用this表示當(dāng)前對象

當(dāng)前對象:當(dāng)前正在調(diào)用發(fā)法的對象蟋恬。

class Person{       // 定義Person類
    public String getInfo(){    // 取得信息的方法
        System.out.println("Person類 --> " + this) ; // 直接打印this
        return null ; // 為了保證語法正確,返回null
    }
};
public class ThisDemo06{
    public static void main(String args[]){
        Person per1 = new Person() ;    // 調(diào)用構(gòu)造實例化對象
        Person per2 = new Person() ;    // 調(diào)用構(gòu)造實例化對象
        System.out.println("MAIN方法 --> " + per1) ;  // 直接打印對象
        per1.getInfo() ;    // 當(dāng)前調(diào)用getInfo()方法的對象是per1
        System.out.println("MAIN方法 --> " + per2) ;  // 直接打印對象
        per2.getInfo() ;    // 當(dāng)前調(diào)用getInfo()方法的對象是per2
    }
};
輸出結(jié)果:
MAIN方法 --> Person@1540e19d
Person類 --> Person@1540e19d
MAIN方法 --> Person@677327b6
Person類 --> Person@677327b6
class Person{       // 定義Person類
    private String name ;   // 姓名
    private int age ;       // 年齡
    public Person(String name,int age){
        this.setName(name) ;
        this.setAge(age) ;
    }
    public void setName(String name){   // 設(shè)置姓名
        this.name = name ;
    }
    public void setAge(int age){        // 設(shè)置年齡
        this.age = age ;
    }
    public String getName(){
        return this.name ;
    }
    public int getAge(){
        return this.age ;
    }
};
public class ThisDemo07{
    public static void main(String args[]){
        Person per1 = new Person("張三",30) ; // 聲明兩個對象,內(nèi)容完全相等
        Person per2 = new Person("張三",30) ; // 聲明兩個對象,內(nèi)容完全相等
        // 直接在主方法中依次取得各個屬性進(jìn)行比較
        if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
            System.out.println("兩個對象相等!") ;
        }else{
            System.out.println("兩個對象不相等!") ;
        }
    }
};

生成兩個對象括尸,當(dāng)兩個對象中的姓名和年齡完全相等時屁柏,則認(rèn)為對象是相等的僧家,但是在此時會產(chǎn)生兩個問題:

  • 如何進(jìn)行對象的比較?
  • 在哪塊進(jìn)行對象的比較肌稻?
    String本身是一個類,如果要想進(jìn)行相等的比較东揣,則要判斷內(nèi)容凉袱,則必須使用equals()方法完成运沦,而age是int型,所以直接使用"=="完成即可烈掠。
class Person{       // 定義Person類
    private String name ;   // 姓名
    private int age ;       // 年齡
    public Person(String name,int age){
        this.setName(name) ;
        this.setAge(age) ;
    }
    public boolean compare(Person per){
        // 調(diào)用此方法時里面存在兩個對象:當(dāng)前對象、傳入的對象
        Person p1 = this ;  // 當(dāng)前的對象,就表示per1
        Person p2 = per ;   // 傳遞進(jìn)來的對象叼风,就表示per2
        if(p1==p2){ // 判斷是不是同一個對象,用地址比較
            return true ;
        }
        // 之后分別判斷每一個屬性是否相等
        if(p1.name.equals(p2.name)&&p1.age==p2.age){
            return true ;   // 兩個對象相等
        }else{
            return false ;  // 兩個對象不相等
        }
    }
    public void setName(String name){   // 設(shè)置姓名
        this.name = name ;
    }
    public void setAge(int age){        // 設(shè)置年齡
        this.age = age ;
    }
    public String getName(){
        return this.name ;
    }
    public int getAge(){
        return this.age ;
    }
};
public class ThisDemo08{
    public static void main(String args[]){
        Person per1 = new Person("張三",30) ; // 聲明兩個對象彬碱,內(nèi)容完全相等
        Person per2 = new Person("張三",30) ; // 聲明兩個對象配乱,內(nèi)容完全相等
        // 直接在主方法中依次取得各個屬性進(jìn)行比較
        if(per1.compare(per2)){
            System.out.println("兩個對象相等!") ;
        }else{
            System.out.println("兩個對象不相等皮迟!") ;
        }
    }
};
輸出結(jié)果:
兩個對象相等搬泥!

地址相等,則兩個對象相等伏尼,如果地址不等忿檩,則以此判斷每一個屬性的內(nèi)容來判斷其是否相等。

2爆阶、總結(jié)

詳細(xì)解釋了this關(guān)鍵字的作用:

  • this.屬性燥透、this.方法(),實際上都表示當(dāng)前的對象中的屬性或當(dāng)前對象調(diào)用的方法
  • this的核心:表示當(dāng)前對象辨图,當(dāng)前正在操作本方法的對象稱為當(dāng)前對象
  • 使用this可以調(diào)用其他構(gòu)造昂奮班套,但是此語句必須放在構(gòu)造方法的首行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市故河,隨后出現(xiàn)的幾起案子吱韭,更是在濱河造成了極大的恐慌,老刑警劉巖鱼的,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件理盆,死亡現(xiàn)場離奇詭異,居然都是意外死亡凑阶,警方通過查閱死者的電腦和手機(jī)猿规,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宙橱,“玉大人姨俩,你說我怎么就攤上這事⊙伲” “怎么了哼勇?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呕乎。 經(jīng)常有香客問我,道長陨晶,這世上最難降的妖魔是什么猬仁? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任帝璧,我火速辦了婚禮,結(jié)果婚禮上湿刽,老公的妹妹穿的比我還像新娘的烁。我一直安慰自己,他們只是感情好诈闺,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布渴庆。 她就那樣靜靜地躺著,像睡著了一般雅镊。 火紅的嫁衣襯著肌膚如雪襟雷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天仁烹,我揣著相機(jī)與錄音耸弄,去河邊找鬼。 笑死卓缰,一個胖子當(dāng)著我的面吹牛计呈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播征唬,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捌显,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了总寒?” 一聲冷哼從身側(cè)響起苇瓣,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎偿乖,沒想到半個月后击罪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贪薪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年媳禁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片画切。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡竣稽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霍弹,到底是詐尸還是另有隱情毫别,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布典格,位于F島的核電站岛宦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耍缴。R本人自食惡果不足惜砾肺,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一挽霉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧变汪,春花似錦侠坎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至番官,卻和暖如春庐完,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲤拿。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工假褪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人近顷。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓生音,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窒升。 傳聞我的和親對象是個殘疾皇子缀遍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法饱须,內(nèi)部類的語法域醇,繼承相關(guān)的語法,異常的語法蓉媳,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,967評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理譬挚,服務(wù)發(fā)現(xiàn),斷路器酪呻,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 睡到12點起床 準(zhǔn)備煮泡面减宣,才發(fā)現(xiàn)潮濕太久整個廚房都霉了。拿著鋼絲球從電飯鍋到墻壁搓了兩個小時才看著順眼玩荠,但是不好...
    是魔王大人閱讀 78評論 1 0
  • # 概述
    3741c100a26d閱讀 197評論 0 1