Java基礎------this關鍵字

this關鍵字

在java中,當創建一個對象後,Java虛擬機就會爲其分配一個指向對象本身的指針,而這個指針就是“this”。

爲什麼要使用this關鍵字?

此時如果有這樣一種場景:
有兩個相同類型的對象,分別叫做a和b,同時調同一個方法f()方法:

class Banana { void f(int i) { /* ... */ }; }
Banana a = new Banana () , b=new Banana();
a.f(1); 
b.f(2);

那麼對於f()這個方法來說,它是如何知道自己到底是被a調用還是b調用呢?

其實編譯器在幕後爲我們做了一些事(第一個自變量傳遞給f(),而且那個自變量是準備操作的那個對象的句柄):

Banana.f(a,1);
Banana.f(b,2);

這就是編譯器內部的表達形式,把要操作的那個對象的句柄傳了進去。通過把操作對象的句柄傳進去,告訴編譯器到底是那個對象調用f()方法。

但是這個對象的句柄就像上述說的,是由編譯器在幕後爲我們執行的,所以沒有“標識符”可用。所以,針對這一現象,java有一個專門的關鍵字,“this”。

this關鍵字的介紹

1、this關鍵字只能在方法內部使用,可爲已調用了其方法的那個對象生成相應的句柄(引用)。可像對待其他任何對象句柄一樣對待這個句柄。

2、假若準備從自己某個類的另一個方法內部調用一個類方法(同樣是在自己的某個類中)或者叫成員方法時,就不必使用this。只需直接調用那個方法即可。當前的this句柄會自動應用於其他方法。

this關鍵字的用法

1、使用this調用本類中的成員變量(屬性)或本類中的成員方法(也可以不加,默認會自動加上)

調用成員變量:

class Student

{ 
private String name; //定義一個成員變量name

public void setName(String name) {//設置姓名,定義一個形參name

name=name; //將局部變量的值傳遞給成員變量 
}

public String getName( ) {
//獲得姓名 
return "姓名:"+name; 
}

}

public class ThisExample01

{ 
public static void main(String args[]) { 

Student stu=new Student(); stu.setName("李明");

System.out.println(stu.getName()); 
}
}

運行結果: null
從運行結果看,通過name=name並沒有正確的將內容賦給屬性,因爲此時的操作的name實際上是方法中的,跟類中的屬性完全不沾邊。

在上述這個類中,有一個成員變量name,同時在方法中有個形式參數,參數名也是name,然後在方法中將形式參數name的值傳給成員變量name。

那麼編譯器是如何判斷使用哪個變量呢?到底是將形式參數name傳遞給成員變量,還是將成員變量傳遞給形式參數name呢?

此時,就可以使用this關鍵字調用本類中的成員變量(屬性),來指明,所以“this.屬性名稱”指明的屬性就是成員變量。

上述代碼改造:

public void setName(String name) {//設置姓名,定義一個形參name

this.name=name; //將局部變量的值傳遞給成員變量 }

public String getName( ) {//獲得姓名 return "姓名:"+name; }}

注意點:
一般情況下,在Java語言中引用成員變量或者成員方法都是以對象名.成員變量或者對象名.成員方法的形式。不過有些程序員即使在沒有相同變量的時候,也喜歡使用this.成員變量的形式來引用變量 。

這主要是從便於代碼的閱讀考慮。一看到這個this關鍵字就知道現在引用的變量是成員變量或者成員方法,而不是局部變量。這無形中就提高了代碼的閱讀性。

調用構造方法:

在一個類中可以存在多個構造方法,這些構造方法都採用相同的名字,只是形式參數不同(構造函數重載)。
Java語言憑用戶的參數來判斷調用哪一個構造方法。

當一個類中有多個構 造方法時,可以利用this關鍵字相互調用。但是,在使用this關鍵字調用其他構造方法的時候,this()調用空的構造方法只能放在構造方法的首行,爲的是能夠爲類中的屬性初始化;而且至少有一個構造方法是不用this調用,否則程序會出現錯誤。使用this調用構造方法只適用於構造方法的調用,類中的其他方法不能使用這種方法

class Student
{
private String name ; 
private int age ; 

public Student () { 
this("李明",20) ;//調用有兩個參數的構造方法
System.out.println("新對象實例化") ; 
} 

public Student (String name) {
this() ;
}

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

public String getInfo(){
return "姓名:" + name + ",年齡:" + age ; 
}

}
public class ThisExample05
{ 
public static void main(String args[]) { 
Student stu1 = new Student ("李小明",19) ;
System.out.println(stu1.getInfo()) ; 
}
}

這時候構造方法就出現了遞歸調用,程序出錯。

引用當前對象:

this最重要的特定就是表示當前對象,那什麼叫當前對象呢?

在Java中當前對象就是指當前正在調用類中方法的對象。

使用this引用當前對象是指如果在類的方法中需要返回一個對象,並且該對象是 方法所在的類的當前對象,可以使用this關鍵字作爲方法的返回值。

public class Car

{ 
public Car getCarObject(){
 return this; //返回當前對象
}

public static void main(String[] args) { 
Car sc = new Car ();//創建一個Car對象 
System.out.println( sc.getCarObject() instanceof Car);
}}

其他用法(對象的比較,可以使用this和引用傳遞進行兩個對象是否相等的判斷)

判斷兩個對象是否相等:

class Student

{ 
private String name ; 
private int age ;

public Student (String name,int age) { 
this.setName(name) ;this.setAge(age) ; 
}

public boolean compare(Student stu) { 
//調用此方法時裏面存在兩個對象:當前對象、傳入的對象
Student s1 = this ;//當前的對象,就表示stu1
Student s2 = stu ;//傳遞進來的對象,就表示stu2
if(s1==s2){// 判斷是不是同一個對象,用地址比較
return true ; 
} //之後分別判斷每一個屬性是否相等 
if(equals()&&s1.age==s2.age){
return true ; //兩個對象相等 
}else{ 
return false ; //兩個對象不相等 
} 
}

public void setName(String name){ //設置姓名  ; }

public void setAge (int age){ 
//設置年齡 this.age = age ; 
}
public String getName(){ return; } 

public int getAge(){ return this.age ; }

}






public class ThisExample07

{ public static void main(String args[]) {

Student stu1 = new Student ("李明",20) ; //聲明兩個對象,內容完全相等

Student stu2 = new Student ("李明",20) ; //聲明兩個對象,內容完全相等

// 直接在主方法中依次取得各個屬性進行比較

if(stu1.compare(stu2)){

System.out.println("兩個對象相等!") ;

}else{ System.out.println("兩個對象不相等!") ;

} }}

地址相等,則兩個對象相等;如果地址不相等,則依次判斷每一個屬性的內容來判斷其是否相等。

總結:

Java中的this與面向對象的程序設計密切相關,它表示當前對象。

this.成員變量、this.成員方法(參數列表):實際上都表示當前對象中的屬性或當前對象調用的方法;this的核心表示當前對象,當前正在操作本方法的對象稱爲當前對象;使用this可以調用其他構造方法,但是此語句必須放在構造方法的首行

this的使用在 節省代碼、區分局部變量與成員變量、對象的比較等方面起着重要的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章