1. 程式人生 > >Java——this關鍵字

Java——this關鍵字

訪問類 遇到 屬性 就是 有效 指向 會有 查看 同名

前言



this關鍵字屬於Java中比較復雜的關鍵字之一,若是學習過C++或者其他的一些面向對象語言也會遇到this這個關鍵字並且都會看到this的含義就是表示當前對象。什麽叫做表示當前對象?this在Java中的用法是怎樣的呢?將分為下面幾點介紹。

  • this調用屬性
  • this調用方法
  • this表示當前對象



this調用屬性



當我們寫參構造函數時,會傾向於將形參名取與將要賦值的屬性名相同,這樣就更容易看見形參就知道它是給哪個屬性賦值。

class Student{
  private String name;
  private int age;
  public Student(String name, int age){
  }
}

在構造函數中賦值的時候,會很容易寫成下面這樣:

class Student{
  private String name;
  private int age;
  public Student(String name, int age){
    name = name;
    age = age;
  }
}

若寫成這樣,當構造Student這個對象並輸出該對象的姓名和年齡時會發現,name為null, age為0。

造成這樣的原因是因為有局部可見性。通常使用{}括起來的一個數據塊叫做一個作用域範圍。在同一個作用域範圍定義了兩個同名的變量則會報錯;若是在該作用域定義了一個與該作用域範圍之外同名的變量則是可以的,在這個作用域同時使用這兩個變量,則在這個作用域中定義的變量會屏蔽作用域範圍之外的那個變量,即作用域中定義的變量才會有效。

這樣說完感覺有點繞。一句話來說,在同一作用域內,作用範圍小的變量會屏蔽同名的作用範圍大的變量。



若是想要Student類中的屬性可以被正確初始化,那麽則需要使用this關鍵字。

class Student{
  private String name;
  private int age;
  public Student(String name, int age){
    this.name = name;
    this.age = age;
  }
}

在我們編程時,訪問類的屬性最好使用this。



this調用方法



this不僅可以調用類中的屬性還可以調用類中的方法。

類中的方法有普通方法和構造方法。

  1. 在本類的普通函數中調用其他普通函數,可以在函數前面加上this也可以不加,但是為了代碼嚴謹性推薦加上this。

  2. 普通方法中不可以調用構造函數,構造函數的調用只能出現在第一次創建對象為對象進行初始化時調用!
  3. 在構造函數中調用普通方法,一般不推薦調用在方法內部使用了屬性的普通方法。因為構造函數還沒有執行完,屬性沒有被完全初始化,這時使用屬性可能會出現異常。
  4. 構造函數之間可以相互調用,構造函數之間相互調用就一定需要使用this關鍵字!

    使用this()表示調用無參構造函數,this(參數,...)表示調用有參構造函數

public class Student{   
    private String name = null;
    private int age = 0;
    public Student() {
        System.out.println("Student():name="+name+",age="+age);
    }
    public Student(String name, int age) {
        this();     //若使用Student()則會報錯:沒有定義這個方法。被當做普通方法來解釋
        this.name = name;
        this.age = age;
        System.out.println("Student(String name, int age):name="+name+",age="+age);
    }
    public static void main(String[] args) {
        Student stu = new Student("Sakura",20);
    }
}
/*
output:
Student():name=null,age=0
Student(String name, int age):name=Sakura,age=20
*/

構造函數之間為什麽要相互調用呢?

因為要減少構造函數中代碼的重復問題,提高代碼的重用性。所以,構造函數之間相互可以調用也就理所當然了。

構造函數之間相互調用有一些限制需要註意:

  • this()或者this(參數,...)需要被放在構造函數內部的首行
  • 進行構造方法相互調用的時候,一定要保留調用的出口!

    至少保留相互調用之間的一個構造函數沒有使用this調用其他構造函數,此構造函數作為出口。避免遞歸調用!



this表示當前對象



我們需要知道同一個類的對象它們的屬性是屬於不同空間的,但是這些對象是共享類中的方法。所以它們需要一種方式表明是它們自己在調用該方法而不是其他的對象。
所以,當對象調用方法時,該對象會作為一個隱含實參傳入到非靜態方法中,在非靜態方法中使用this來指向它,表明是它在調用該方法

查看下面例子,可以發現this就是指向的是當前正在調用類中方法的對象。
技術分享圖片

所以前面使用this.屬性也就很容易理解了,就是當前對象的屬性。



小結



介紹了Java中this主要使用的三個方面:①類中的屬性調用要加上this:this。屬性的方式。②this用來構造函數之間的相互調用,一定要保留調用出口③this表示當前對象,指的是當前正在調用類方法的對象。

Java——this關鍵字