1. 程式人生 > >Java基礎(三)----------Java中this和super關鍵字

Java基礎(三)----------Java中this和super關鍵字

1.this物件本身

在Java語言中,當建立一個物件後,Java虛擬機器就會為其分配一個指向物件本身的指標,這個指標就是“this”(在java裡面沒有指標的定義。但是java裡面的“指標”無處不在)。

在我們使用this時,this一般出現在類的方法裡面,當這個方法還沒有呼叫的時候this指的是誰並不知道,但是實際當中如果new一個物件出來之後,this指的就是當前這個物件,對哪個物件呼叫這個方法this指的就是誰.如果再new一個物件,這個物件也有自己的this.this指的就是另外一個物件了。

this應用場景:

(1)引用成員變數,this這個關鍵字其代表的就是物件中的成員變數或者方法。

public class User {
	 String name; 	//	定義一個成員變數name
	 
	 private void SetName(String name) { 	//	定義一個區域性變數name
		 this.name=name; //	將區域性變數的值傳遞給成員變數
	 }
}

(2)呼叫類的構造方法,this這個關鍵字其代表的就是物件中的成員變數或者方法。

public class User {	//	定義一個類,類的名字為User
	
	public User(String name) { //	定義一個帶形參的構造方法
		
	}
	
	public User() {	//	定義構造方法
		this("張三");	//	呼叫類的構造方法
	}
}

(2)返回物件的值,可以使用return this來返回一個類的引用(實際呼叫這個方法的例項物件)。

public class User {	
	String name;	//	定義一個成員變數name
	
	User setName(String name) {	//	定義一個區域性變數name
		this.name = name;	//	將區域性變數的值傳遞給成員變數
		return this;	//返回物件User
	}
	
	public static void main(String[] args) {
		User u=new User();	//	建立User物件
		User user=u.setName("張三");	//	呼叫setName,獲取返回的新物件
		
		System.out.println(user.name);	//列印name的值
	}
	
}

參考了Java初級碼農java中this關鍵字的作用

2.super父類物件

super關鍵字表示對某個類的父類的引用。

super應用場景:

(1)訪問被子類的成員隱藏的父類成員。

public class SuperTest {
	
	public String name;	//	定義一個成員變數name
	
	public void s() {	//	定義一個普通方法
		name="父類";		//	給成員變數賦值
		System.out.println("super類的名稱叫"+name);
	}
}
public class ChildTest extends SuperTest{

	public void s() {	//重寫方法s
		super.s();//	使用super作為父類物件的引用物件來呼叫父類物件裡面的s()方法
	}
	public static void main(String[] args) {
		ChildTest t=new ChildTest();	
		t.s();
	}
}

(2)呼叫父類的建構函式,建構函式不會被繼承。只會被呼叫。

public class SuperTest {
	
	public SuperTest() { //	定義一個帶形參的構造方法
		System.out.println("super類的無參構造方法");
	}
	
	public SuperTest(String name) {	//	定義構造方法
		System.out.println("super類的有參構造方法");
	}
	
}
public class ChildTest extends SuperTest{

	public ChildTest(){
      super();//	子類所有的 建構函式 預設呼叫父類的無參建構函式,可省略省略掉super();也可以自行新增到建構函式的第一行(必須是第一行,否則報錯)
      System.out.println("子類 無參 建構函式");
    }
	public ChildTest(String name){
		super(name);//呼叫父類中的有參建構函式(應該為建構函式中的第一條語句)
		System.out.println("子類 有參 建構函式");
	}
}
  •  子類所有的 建構函式預設呼叫父類的無參建構函式,可省略super(),若是想寫上必須寫在第一行。
  • 如果子類的某個建構函式想呼叫父類的其他的帶引數的建構函式,在建構函式的第一行新增 super(val1,val2,…)。
  • 添加了super(val1,val2,…),就可以指定呼叫父類的那個引數型別和數量一致的建構函式。之後在此子類建構函式中,系統不會再預設呼叫父類無參建構函式。
  • super指代父類物件,可以在子類中使用 super.父類方法名();呼叫父類中的方法。

參考了Yi騎絕塵Java 子類呼叫父類建構函式----super()詳解

3.this和super的區別

參考了億念之茶Java super和this的異同總結https://blog.csdn.net/lh__huahuan/article/details/50447812

  • super()和this()類似,區別是,super()從子類中呼叫父類的構造方法,this()在同一類內呼叫其它方法。
  • super()和this()均需放在構造方法內第一行。
  • 儘管可以用this呼叫一個構造器,但卻不能呼叫兩個。
  • this和super不能同時出現在一個建構函式裡面,因為this必然會呼叫其它的建構函式,其它的建構函式必然也會有super語句的存在,所以在同一個建構函式裡面有相同的語句,就失去了語句的意義,編譯器也不會通過。
  • this()和super()都指的是物件,所以,均不可以在static環境中使用。包括:static變數,static方法,static語句塊。
  • 從本質上講,this是一個指向本物件的指標, 然而super是一個Java關鍵字。