天天看點

Java中的this和super參數

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方法時無參的,是以就需要父類中有一個無參的構造方法才行。