目錄
this是一個非常靈活的關鍵字,不會明確表示一個固定概念,比如int,它就是表示一個整型。
1、調用本類屬性
類中有許多成員,大部分情況下類中直接進行成員調用,但是爲了清楚的描述調用是本類屬性,會用this.屬性表示。
class Person{
String name;
int age;
public Person(){}
public Person(String name, int age) {
name = name;
age = age;
}
}
如上定義的類,構造方法按上述寫法,對象中不會保存我們定義的內容,而是默認值,因爲程序以{}爲界定範圍,如果在此範圍內有指定的變量名稱,則會直接調用,若沒有,則會調用類中的相應屬性。
當參數與屬性名稱相同時,則會出現混淆,則需要用戶自己手動明確調用的是屬性還是方法中的參數,若是屬性,則需要加this.屬性,標準程序開發中都會以此方式進行:
class Person{
String name;
int age;
public Person(){}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
2、調用本類方法
一個類中存在普通方法和構造方法,this調用本類方法時,對應的語法不同:
1)調用本類中的其他方法:this.方法()
一個類中可能存在很多方法,這些方法之間可以直接進行調用,但是不夠標準,應用this.方法()調用,標準化風格。
2)調用本類其他構造方法:this()
一個類中可以有多個方法,且可以重載,並且構造方法在實例化對象時只能被調用一次。
若現在需求:Person類中中有三個構造方法,無論調用哪個構造方法,都要求執行語句"**********"。
【舉例】:原始實現方式
class Person{
String name;
int age;
public Person(){
System.out.println("********");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("********");
}
}
程序設計的一個重要原則,避免重複代碼。按照這個原則,以上的代碼並不符合開發要求,這時可以使用this()形式實現,調用本類無參構造。
class Person{
String name;
int age;
public Person(){
System.out.println("********");
}
public Person(String name) {
this();
this.name = name;
}
public Person(String name, int age) {
this(name);
this.name = name;
this.age = age;
}
}
需要注意的是,this()形式只能放在構造方法的首行。在使用this()調用本類其他構造方法時,應該避免循環調用。
下面通過實例說明構造方法互調的意義所在。
【舉例】:寫一個僱員的信息類,類中提供如下四個屬性:姓名、職位、部門、工資,還有4個構造方法:
- 無參構造:姓名未知、職位待定、部門後勤、工資爲0;
- 單參構造(姓名):職位主管、部門技術部、工資10;
- 雙參構造(姓名、部門):職位工程師、工資5;
- 四參構造。
針對以上要求可以有兩種代碼實現方法:
第一種:傳統實現
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Emp emp = new Emp();
System.out.println(emp.getInfo());
}
class Emp{
private String name;
private String job;
private String dept;
private double sal;
public Emp(){
this.name ="未知";
this.job = "待定";
this.dept = "後勤";
this.sal = 0.0;
}
public Emp(String name){
this.name =name;
this.job = "主管";
this.dept = "技術部";
this.sal = 10.0;
}
public Emp(String name,String dept){
this.name =name;
this.job = "工程師";
this.dept = dept;
this.sal = 5.0;
}
public Emp(String name,String job, String dept, double sal){
this.name =name;
this.job =job;
this.dept = dept;
this.sal = sal;
}
public String getInfo(){
return "姓名:"+this.name+"職位:"+this.job+"部門:"+this.dept+"工資:"+this.sal;
}
}
以上程序重複的代碼太多,過於冗餘。
第二種:使用this改進
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Emp emp = new Emp();
System.out.println(emp.getInfo());
}
class Emp{
private String name;
private String job;
private String dept;
private double sal;
public Emp(){
this("未知","待定","後勤",0.0);
}
public Emp(String name){
this(name,"主管","技術部",10.0);
}
public Emp(String name,String dept){
this(name,"工程師",dept,5.0);
}
public Emp(String name,String job, String dept, double sal){
this.name =name;
this.job =job;
this.dept = dept;
this.sal = sal;
}
public String getInfo(){
return "姓名:"+this.name+"職位:"+this.job+"部門:"+this.dept+"工資:"+this.sal;
}
}
以上代碼消除了很多重複代碼,實際開發中應用較多。
3、表示當前對象
一個類,可以生成若干個對象,每個對象都可調用類中的方法,類中實際上很難描述某一個具體的對象,爲了能區分出當前正在操作類中的方法是哪一個,可以使用this完成。
【舉例】:觀察
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Person perA = new Person();
Person perB = new Person();
System.out.println("MainActivity類中對象輸出:"+perA);
System.out.println("MainActivity類中對象輸出:"+perB);
}
class Person{
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Person perA = new Person();
Person perB = new Person();
System.out.println("MainActivity類中對象輸出:"+perA);
perA.print();
System.out.println("--------------------------------");
System.out.println("MainActivity類中對象輸出:"+perB);
perB.print();
}
class Person{
void print(){
System.out.println("Person類中的輸出,this="+this);
}
}
由以上可知,由perA調用print()方法時,this=perA,由perB調用print()方法時,this=perB, 所以,this的對象引用會隨着調用類方法對象的不同而不同,屬於相對性的概念。
進一步考慮,this.屬性表示的就是當前對象中的屬性。