JavaSE之面向物件程式設計—類與物件(上)—— 4
一、首先介紹一下this關鍵字的用法:
總的來說this共有三類用法:
1.this呼叫本類屬性
2.this呼叫本類方法
3.this表示當前物件
下面通過栗子來具體的解釋每種用法:
1.this呼叫本類屬性
注意:一個檔案只能有一個公有的類,並且檔名應該和公有的類名一致;如果定義一個類沒有用public修飾那麼它就是私有類。
class KeyWord{//私有類 private String name; private int age; public Person(String name,int age){ name=name; age=age; } public String getPersonInfo(){ return "姓名"+name+",年齡"+age; } } public class Test{//公有類 public static void main(String[] args){ Person per = new Person("張三",20); System.out.println(per.getPersonInfo()); } }
通過上面程式碼的執行結果我們可以看到,當引數和屬性名相同的時候,類中的屬賦值性無法被正確的賦值。因為它不知道這個屬性到底是誰的屬性,所以我們需要加上this關鍵字,當建立物件的時候就會表示當前給當前物件屬性賦值。
public Person(String name,int age){
this.name=name;
this.age=age;
}
賦值以後的結果:
注意:只要在訪問類中的屬性就一定要加上this關鍵字。
2.this呼叫本類方法
(1)呼叫普通方法:this.方法名稱(引數)
(2)呼叫構造方法:this(引數)
(1)this呼叫普通方法
栗子:
class Person{ private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; this.print();//呼叫本類普通方法(原則上這可以不用加this) } public String getpersonInfo(){ return "姓名"+name+",年齡"+age; } public void print(){ System.out.println("****************"); } } public class Test1{ public static void main(String[] args){ Person per=new Person("張三",20); System.out.println(per.getpersonInfo()); } }
注意:雖然在呼叫本類普通方法時可以不用加this,但是建議還是加上免得混淆。
(2)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 getPersonInfo(){
return "姓名"+name+",年齡"+age;
}
}
public class Test1{
public static void main(String[] args){
Person per1=new Person();
Person per2=new Person("張三");
Person per3=new Person("張三",20);
System.out.println(per1.getPersonInfo());
System.out.println(per2.getPersonInfo());
System.out.println(per3.getPersonInfo());
}
}
對於以上的程式碼中構造方法的問題出現在,構造方法過載的時候我們寫了大量重複的程式碼;那麼為了減少這樣的操作,我們必須可以通過呼叫this方法。在java中,支援this方法的相互呼叫。
將上面的程式段通過 相互呼叫this修改為:
class Person{
private String name;
private int age;
public Person(){
System.out.println("****產生一個新物件*****");
}
public Person(String name){
System.out.println("****產生一個新物件*****");
this();//呼叫本類無參建構函式
this.name=name;
}
public Person(String name,int age){
System.out.println("*****產生一個新物件*****");
this(name);//呼叫本類中有一個引數的建構函式
this.age=age;
}
public String getPersonInfo(){
return "姓名"+name+",年齡"+age;
}
}
public class Test1{
public static void main(String[] args){
Person per1=new Person();
Person per2=new Person("張三");
Person per3=new Person("張三",20);
System.out.println(per1.getPersonInfo());
System.out.println(per2.getPersonInfo());
System.out.println(per3.getPersonInfo());
}
}
執行的結果和上面是一樣的。但是需要注意的是:我們在構造方法中使用this呼叫的時候,this語句一定是放在第一句的,否則就不能起作用。
3.使用this表示當前物件
class Person{
public void print(){
System.out.println("[print]方法:"+this);//這個this表示誰待用它,就是哪個物件
}
}
public class Test1{
public static void main(String[] args){
Person p1= new Person();
System.out.println("[main]方法"+p1);//後面連線的是物件p1
p1.print();//p1呼叫print()方法
System.out.println("=========");
Person p2 = new Person();
System.out.println("[main]方法"+p2);
p2.print();
}
}
執行結果:
通過這段程式碼以及它的執行結果我們可以看到,只要物件呼叫了本類中的方法,那麼這個this就表示當前執行的物件。上面的p1、p2分別呼叫,這個this分別表示p1、p2兩個物件,所以輸出的main和print方法後面的都是用一個編碼,表示同一個物件。