Java里this的作用和用法


對象創建的過程和this的本質

  構造方法是創建Java對象的重要途徑,通過new關鍵字調用構造器時,構造器也確實返回該類的對象,但這個對象並不是完全由構造器負責創建。創建一個對象分為如下四步:

  1. 分配對象空間,並將對象成員變量初始化為0或空

  2. 執行屬性值的顯示初始化

  3. 執行構造方法

  4. 返回對象的地址給相關的變量

  this的本質就是“創建好的對象的地址”! 由於在構造方法調用前,對象已經創建。因此,在構造方法中也可以使用this代表“當前對象” 。

  this最常的用法:

  1.  在程序中產生二義性之處,應使用this來指明當前對象;普通方法中,this總是指向調用該方法的對象。構造方法中,this總是指向正要初始化的對象。

  2. 使用this關鍵字調用重載的構造方法,避免相同的初始化代碼。但只能在構造方法中用,並且必須位於構造方法的第一句。

  3. this不能用於static方法中。

【示例4-8】this代表“當前對象”示例

 1 public class User {
 2     int id;        //id
 3     String name;   //賬戶名
 4     String pwd;   //密碼
 5  
 6     public User() {
 7     }
 8     public User(int id, String name) {
 9         System.out.println("正在初始化已經創建好的對象:"+this);
10         this.id = id;   //不寫this,無法區分局部變量id和成員變量id
11         this.name = name;
12     }
13     public void login(){
14         System.out.println(this.name+",要登錄!");  //不寫this效果一樣
15     }   
16      
17     public static void main(String[] args) {
18         User  u3 = new User(101,"高小七");
19         System.out.println("打印高小七對象:"+u3);
20         u3.login();
21     }
22 }

 

 

 
        

 

 【示例4-9】this()調用重載構造方法

 

 1 public class TestThis {
 2     int a, b, c;
 3  
 4     TestThis() {
 5         System.out.println("正要初始化一個Hello對象");
 6     }
 7     TestThis(int a, int b) {
 8         // TestThis(); //這樣是無法調用構造方法的!
 9         this(); // 調用無參的構造方法,並且必須位於第一行!
10         a = a;// 這里都是指的局部變量而不是成員變量
11 // 這樣就區分了成員變量和局部變量. 這種情況占了this使用情況大多數!
12         this.a = a;
13         this.b = b;
14     }
15     TestThis(int a, int b, int c) {
16         this(a, b); // 調用帶參的構造方法,並且必須位於第一行!
17         this.c = c;
18     }
19  
20     void sing() {
21     }
22     void eat() {
23         this.sing(); // 調用本類中的sing();
24         System.out.println("你媽媽喊你回家吃飯!");
25     }
26  
27     public static void main(String[] args) {
28         TestThis hi = new TestThis(2, 3);
29         hi.eat();
30     }
31 }

 

this, 一個官方的說法是,this首先是一個對象,它代表調用這個函數的對象。

根據面向對象的基本語法,每當調用變量或者函數的時候,都要按照類名.變量(函數)的格式來調用,意即每個變量或函數都必須屬於某一個實際的對象而不是一個類(static的除外).
       在不會產生混淆的地方, this是可以省略的,但一般都會加上,(Think in Java里面說最好不要加,因為大家都不加)

例如,下面的程序中,類"Person"里面加與不加 this 編譯運行后的結果是一樣的:

 package testThis;
 2 
 3 public class Test {
 4     public static void main(String args[]){
 5         Person p1 = new Person();
 6         p1.name = "zhangsan";
 7         Person p2 = new Person();
 8         p2.name = "lisi";
 9         
10         p1.talk();
11         p2.talk();
12     }
13 }
14 
15 class Person{
16     String name;
17     void talk(){
18         System.out.println("My name is " + this.name);
19     }
20 }
復制代碼

 上面的代碼里第18行,不管是"this.name"還是"name",運行的結果都是:

My name is zhangsan
My name is lisi

 因為前面已經把p1和p2里面的name變量賦值,所以執行方法的時候,都會打印出它們各自的數據.

但是,當函數里面有參數時,如果函數的參數和成員變量一樣,這時不加this的話,程序就會根據"就近原則",自動調用最近的值,如下面的代碼:

 
        

 因為前面已經把p1和p2里面的name變量賦值,所以執行方法的時候,都會打印出它們各自的數據.

 

上面已經把對象p1和p2里面的變量name分別賦值為"zhangsan"和"lisi",但類"Person"里面的方法"talk"現在有了參數"String name",而且沒有加"this",這時如果運行這個方法,方法就會接收后面參數傳送給它的值,分別是"zhang"和"li",這時運行結果就會是:

My name is zhang
My name is li

所以,這里雖然對象p1和p2各有自己的變量 name,但它們調用的方法接收的卻是參數里面的值,(從系統里各變量的顏色背景也可心看出對應的變量),而不是它們自己本身的值.所以這里輸出的結果跟它們自己內部的值無關.

如果想要在它們各自調用talk()方法時分別輸出自己內部的值,則需要在類 "Person"里面的方法"talk"里加上"this",這樣,當它們各自調用這個方法時,輸出的結果都是它們各自內部變量的值了

 

參考博文:https://www.cnblogs.com/livterjava/p/4709383.html

 


免責聲明!

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



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