Java基礎(三)----------Java中this和super關鍵字
阿新 • • 發佈:2019-01-14
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的值 } }
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關鍵字。