1. 程式人生 > >Java語言基礎this關鍵字

Java語言基礎this關鍵字

this是什麼?

  1. this是一個引用型別
  2. 在堆中的每一個物件都有this
  3. this儲存記憶體地址只指向自身

this能用在什麼地方

  1. this可以用在成員方法中
    1. 誰去呼叫這個成員方法,this就代表誰
    2. this指的就是當前物件(“this.”可以省略)
public class ThisTest_01 {

	public static void main(String[] args) {

		//建立物件
		Employee e1 = new Employee(123,"zhangsan");
		
		e1.work();
		
		//建立物件
		Employee e2 = new Employee(456,"lisi");
		
		e2.work();
		
		e1.m1();

	}

}

class Employee{
	
	//員工編號
	int empno;
	
	//員工姓名
	String name;
	
	//C0nstructor(無引數構造方法)
	Employee() {}
	
	//Constructor(有引數構造方法)
	Employee(int _empno,String _name){
		
		empno = _empno;
		name = _name;
		
	}
	
	public void work() {
		//this就是當前物件,誰去呼叫這個方法,this就代表誰
		//this指的就是當前物件
		//this.可以省略
		System.out.println(this.name + "在工作");
		
	}
	
	//成員方法
	public void m1() {
		this.m2();
		m2();
	}
	
	//成員方法
	public void m2() {
		System.out.println("Testing");
	}
	
}
  1. this可以用在構造方法中​​​​​​​​​​​​​​​​​​​​
    1. 語法:this(實參);
    2. 過程:通過一個構造方法呼叫另一個構造方法
    3. 目的:程式碼重用
public class ThisTest_02 {

	public static void main(String[] args) {

		/*
		//建立物件
		MyDate data1 = new MyDate(2018,8,22);
		
		System.out.println(data1.year + "年" + data1.month + "月" + data1.day + "日");
		*/
		
		//建立物件
		MyDate t3 = new MyDate();
		System.out.println(t3.year + "年" + t3.month + "月" + t3.day + "日");
	}

}

class MyDate{
	
	//Field(屬性)
	int year;
	int month;
	int day;
	
	//Constructor(構造方法)
	//需求:在建立日期物件時,預設日期時1970-1-1
	//無引數構造方法
	MyDate() {
		//this(實參)必須處於構造方法的第一行
		this(1970, 1, 1);
		/*
		this.year = 1970;
		this.month = 1;
		this.day = 1;
		*/
	}
	
	//含引數構造方法
	MyDate(int _year,int _month,int _day){
		year = _year;
		month = _month;
		day = _day;
	}
	
}

this可以用來區分成員變數和區域性變數

public class ThisTest_03 {

	public static void main(String[] args) {
		
		//建立物件m1,名字:king
		Manager m1 = new Manager("King");
		
		//建立物件m2
		Manager m2 = new Manager();
		//設定名字:wang
		m2.setName("Wang");
		
		//列印
		System.out.println(m1.getName());
		System.out.println(m2.getName());
	}

}

//類:經理
class Manager{
	
	//Field
	private String name;
	
	//Constructor
	Manager(){}
	
	Manager(String name) {
		this.name = name;
	}
	
	//Method
	//成員方法:設定名字
	public void setName(String name) {
		this.name = name;
	}
	
	//成員方法:獲取名字
	public String getName() {
		return this.name;
	}
	
}

this不能用在靜態方法中

  1. 靜態方法的執行不需要Java物件,直接引用類名的方式訪問
  2. this指當前物件,而靜態變數中沒有物件
public class ThisTest_04 {

	String str;
	
	//入口
	public static void main(String[] args) {

		Person.m1();
		//str是成員變數,必須由 引用. 訪問
		//錯誤:
		//System.out.println(str);
		
		
		ThisTest_04 tt = new ThisTest_04();
		System.out.println(tt.str);
		
	}

}

class Person{
	
	//Field(屬性)
	String name;
	
	//Constructor(無引數構造方法)
	Person() {}
	
	//Constructor(有引數構造方法)
	Person(String name){
		this.name = name;
	}
	
	public static void m1() {
		Person p1 = new Person();
		p1.name = "張三";
		System.out.println(p1.name);
	}
}

this();通過一個語法呼叫另外一個構造方法(程式碼重用)

this(實參);必須處於構造方法的第一行