1. 程式人生 > >JavaSE之面向物件程式設計—類與物件(上)—— 4

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方法後面的都是用一個編碼,表示同一個物件。