this關鍵字的使用


一,表示類中屬性

1,沒有使用this的情況

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

可以得出結論:此時並沒有正確將內容賦給屬性;

假設身邊有一只筆,遠處也有一只筆,肯定會就近拿身邊的筆。這在構造方法中一樣。

所以此時操作的name,age都是構造方法中定義的name,age.跟類中屬性完全不沾邊。

此時,為了明確哪個是類中的屬性,需要加上this.類中屬性。

class Person{        // 定義Person類
    private String name ;        // 姓名
    private int age ;            // 年齡
    public Person(String name,int age){    // 通過構造方法賦值
        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) ;    // 調用構造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};
運行結果:
姓名:張三,年齡:33

二,this調用構造方法

如果在類中有多個構造方法,也可以利用this關鍵字互相調用。

假設一個類中存在多個構造方法,但無論多少構造方法,都要打造一個“新對象實例化”,此時就有兩種做法。

按照最原始方法:

class Person{        // 定義Person類
    private String name ;        // 姓名
    private int age ;            // 年齡
    public Person(){    // 無參構造
        System.out.println("新對象實例化") ;
    }
    public Person(String name){
        System.out.println("新對象實例化") ;
        this.name = name ;
    }
    public Person(String name,int age){    // 通過構造方法賦值
        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) ;    // 調用構造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};

因為以上紅色部分重復了,現在只是一行,感覺不出來,但是如果現在代碼很多行的話,缺陷立刻顯現出來了。

此時,最好讓構造方法間進行互相調用。

使用:this(若干參數)的形式完成。

package methoud;
class Person{        // 定義Person類
    private String name ;        // 姓名
    private int age ;            // 年齡
    public Person(){    // 無參構造        
        System.out.println("新對象實例化") ;
    }
    public Person(String name){
        this() ;// 調用本類中的無參構造方法
        this.name = name ;
    }
    public Person(String name,int age){    // 通過構造方法賦值
        this(name) ;// 調用有一個參數的構造方法
        this.age = age ;// 為類中的age屬性賦值
    }
    public String getInfo(){    // 取得信息的方法
        return "姓名:" + name + ",年齡:" + age ;
    }
};
public class ThisDemo06{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ;    // 調用構造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};
運行結果:
新對象實例化
姓名:張三,年齡:33

注意點:

在使用this關鍵字調用其他關鍵字的時候,有以下限制:

1)this()調用其他構造方法的語句只能放構造方法(在其他普通方法里是不行的)首行

2)在使用this調用其他構造方法的時候,至少有一個構造方法是不用this調用的。(必須要有結尾,不能無限期的調用下去,循環遞歸調用);

如下就會出錯:

 

package methoud;
class Person{        // 定義Person類
    private String name ;        // 姓名
    private int age ;            // 年齡
    public Person(){    // 無參構造
        System.out.println("新對象實例化") ;
    }
    public Person(String name){
        this.name = name ;
        this() ;// 調用this()方法只能放在構造方法首行
    }
    public Person(String name,int age){    // 通過構造方法賦值
        this(name) ;// 調用有一個參數的構造方法
        this.age = age ;// 為類中的age屬性賦值
    }
    public String getInfo(){    // 取得信息的方法
        this() ;// 其他普通方法不能調用this()方法
        return "姓名:" + name + ",年齡:" + age ;
    }
};
public class ThisDemo04{
    public static void main(String args[]){
        Person per1 = new Person("張三",33) ;    // 調用構造實例化對象
        System.out.println(per1.getInfo()) ;    // 取得信息
    }
};

 

 

 

三,使用this關鍵字調用當前對象。

當前對象:當前正在調用方法的對象。

如下,分別用兩種方法打印對象per1和per2

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() ;    // 調用構造實例化對象
        Person per2 = new Person() ;    // 調用構造實例化對象
        System.out.println("MAIN方法 --> " + per1) ;    // 直接打印對象
        per1.getInfo() ;    // 當前調用getInfo()方法的對象是per1
        System.out.println("MAIN方法 --> " + per2) ;    // 直接打印對象
        per2.getInfo() ;    // 當前調用getInfo()方法的對象是per2
    }
};
運行結果:

MAIN方法 --> methoud.Person@2a139a55
Person類 --> methoud.Person@2a139a55
MAIN方法 --> methoud.Person@15db9742
Person類 --> methoud.Person@15db9742

可見,用this調用的是當前對象,與直接per1,per2是一樣的效果。

四,對象的比較

以下這個例子中,生成兩個對象,當對象中年齡和姓名完全相等的時候,則認為兩個對象是相等的,此時有兩個問題

1)如何進行對象比較:

2)在那塊對象比較:

String本身是一個類,如果要進行相等比較,需要使用equls(),而,age是Int,直接使用==判斷。

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){    // 設置姓名
        this.name = name ;
    }
    public void setAge(int age){        // 設置年齡
        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) ;    // 聲明兩個對象,內容完全相等
        Person per2 = new Person("張三",30) ;    // 聲明兩個對象,內容完全相等
        // 直接在主方法中依次取得各個屬性進行比較
        if(per1.getName().equals(per2.getName())&&per1.getAge()==per2.getAge()){
            System.out.println("兩個對象相等!") ;
        }else{
            System.out.println("兩個對象不相等!") ;
        }
    }
};
運行結果:
兩個對象相等!

以上代碼,功能確實實現了,但是由於代碼暴露在外面,不安全,容易出錯。

應該由自己進行比較最合適,所以應該在Person類中增加一個比較的方法。

當前對象調用傳人的對象,當前對象即調用方法的對象,用this表示,

這里表示在哪里比較。

如下:

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){
        // 調用此方法時里面存在兩個對象:當前對象、傳入的對象
         Person p1 = this ;    // 當前的對象,就表示per1
        Person p2 = per ;    // 傳遞進來的對象,就表示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){    // 設置姓名
        this.name = name ;
    }
    public void setAge(int age){        // 設置年齡
        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) ;    // 聲明兩個對象,內容完全相等
        Person per2 = new Person("張三",30) ;    // 聲明兩個對象,內容完全相等
        // 直接在主方法中依次取得各個屬性進行比較
        if(per1.compare(per2)){
            System.out.println("兩個對象相等!") ;
        }else{
            System.out.println("兩個對象不相等!") ;
        }
    }
};
運行結果:
兩個對象相等!
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM