Java學習筆記之this關鍵字
阿新 • • 發佈:2018-12-25
初學java,發現很多地方會用到this關鍵字,但是挺多地方都不太明白為什麼要用它,或者說在什麼地方什麼情況下應該用this關鍵字,那我們一起來總結一下。
this關鍵字除了強調本類中的方法之外,還可以有以下作用
- 表示類中的屬性
- 強調本類的構造方法
- 用this表示當前物件
1、表示類中的屬性
class Person{
private String name;
private int age;
public Person(String name, int age){ // 通過構造方法賦值
// this.name = name;
// this.age = age;
// 如果用這樣的方式賦值
name = name; // 為 name 屬性賦值
age = age; // 為 age 屬性賦值
}
public String getInfo(){
return "姓名:" + name + " 年齡:" + age;
}
}
public class ChapterFive {
public static void main(String[] args) {
Person p1 = new Person ("張三",22);
System.out.println(p1.getInfo());
}
}
執行結果:
姓名:null 年齡:0
可以看到,其實並沒有將正確的內容賦值給屬性,就好比你想拿筆寫字,你現在面前已經有一支筆了,另外在隔壁屋裡還有一支一模一樣的,那你會選擇用那一隻呢?肯定是會就近用眼前的,所以此時操作的name和age都是構造方法裡的值,不是類中的屬性。
為了明確表示出是類的屬性,我們需要加上 “this.屬性名稱” 操作
class 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 ChapterFive {
public static void main(String[] args) {
Person p1 = new Person("張三",22);
System.out.println(p1.getInfo());
}
}
執行結果:
姓名:張三 年齡:22
2、用 this 呼叫構造方法
如果一個類裡有多個構造方法,可以用 this 關鍵字互相呼叫
假設有一個類,有多個構造方法,每個構造方法都會列印一句 “新物件例項化”
- 原始的實現方式
class 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; // 重複
this.age = age;
}
public String getInfo(){
return "姓名:" + name + " 年齡:" + age;
}
}
可以看到,在上述構造方法裡,都會有重複的程式碼出現,當屬性少的時候沒有太大影響,當屬性數量大的時候弊端就立馬體現,會有大量的冗餘程式碼。
- 使用 this 修改上述程式碼
class 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;
}
public String getInfo(){
return "姓名:" + name + " 年齡:" + age;
}
}
注意點
- this 呼叫構造方法時必須放在構造方法的第一行
- 用 this 呼叫其它構造方法時,必須至少有一個不用 this 呼叫的
3、用 this 進行物件比較
class Person{
private String name;
private int age;
public Person(String name, int age){
this.setName(name);
this.setAge(age);
}
public String getInfo(){
return "姓名:" + name + " 年齡:" + age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean compare(Person per){
// 呼叫此方法時裡面存在兩個物件:當前物件和傳入的物件
Person p1 = this; // 當前物件
Person p2 = per; // 傳入的物件
if(p1==p2){
return true;
}else{
return false;
}
}
}
public class ChapterFive {
public static void main(String[] args) {
Person p1 = new Person("張三",22);
Person p2 = new Person("張三",22);
System.out.println(p1.getInfo());
if(p1.compare(p2)){
System.out.println("兩個物件相等");
}else{
System.out.println("兩個物件不相等");
}
}
}
輸出結果:
姓名:張三 年齡:22
兩個物件不相等
地址相等,則兩個物件相等,如果地址不相等,則依次判斷每一個屬性的值是否相等。