Copyright©Stonee
1. this
在Java中,無論程式員是否在執行個體方法中添加,編譯器都會自動往執行個體方法中加入一個this參數,this參數的類型為方法所在類的類型。
- 假設說fun() 是類中的一個方法,當調用這個方法的時候,編譯器會把它變為this.fun() 然後通過this去找到fun所在的類。在這之前,當this被檢測到時會被壓棧,等到找到fun方法後,會把this出棧然後再傳回去,形成:fun(this)
- 這也就是為什麼當我們在用構造方法時可以使用this的原因,舉個栗子:
package chapter05;
/**
* This program demonstrates "this" in Java
* @version 1.0 2019-3-27
* @author stonee(http://www.stonee.club)
*/
public class thisAndFunc {
public static void main(String [] args){
f a = new f();
a.func();
}
}
class f{
String name;
public void func(){ //this被作為參數傳入func中,因為this是類f的類型,是以可以通過this調用f的字段,即this.name
this.name = "Wang";
System.out.println(name);
}
}
大家再思考這麼一個問題,如果父類中有a和b兩個函數,a調用了b函數,此時子類覆寫了b函數,那麼在子類中,a函數是調用父類b函數還是子類覆寫的b函數呢?如下:
class A {
public void f(){
System.out.println("A::f()");
}
public void ff(){
f();
}
}
class B extends A {
public void f(){
System.out.println("B::f()");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
A ab = b;
b.f();
b.ff();
ab.f();
ab.ff();
}
}
運作結果是四個B::f()
答案顯而易見。原因也是因為ff()在調用f()時,f()會變成this.f(),而this的傳回值是它所在的類,即B,是以B中繼承的ff()會調用自己的f()。
2. super
super和this的共同之處是都可以被編譯器自動添加,但是this是本類的類型,但是super是基類的類型。
super有兩種常見的用法:
① 調用父類構造方法 super(參數);
② 調用父類一般方法 super.func(參數);
因為根類是object,是以編譯器在編譯的時候會把構造方法中自動添加一個super();用來繼承根類構造方法。
如果根類中沒有沒有參數的構造方法,那麼這個程式是不能編譯運作的,是因為編譯器會自動給子類加上一個super(),因為自動加入的這個super方法時無參的,是以就需要父類中有一個無參的構造方法才行。