1. 程式人生 > >super與this關鍵字的用法與區別

super與this關鍵字的用法與區別

介紹: this:當前物件

                super:直接父類物件

                this():當前類的無參構造方法,也可以指定有參的如:this(a)

                super():直接父類的無參構造方法,也可以指定有參的如:super(a)

注意:1,當在方法內呼叫一個變數b,編譯器會向上遍歷,直到找到最近的一個引用變數為止:b—>this.b—>super.b,如果未找到,編譯器將顯式提                   示錯誤資訊;

           2,當變數b的定義只發生在父類時,此時  b=this.b=super.b;

           3,當局部變數b覆蓋成員變數b時,使用this.b呼叫成員變數,此時的成員變數包括子類新增和繼承的變數,不包含隱藏變數;

           4,當子類成員變數b覆蓋父類成員變數b時,使用super.b呼叫這個被隱藏的成員變數;

           5,當子類重寫了父類方法method(),可以使用super.method()來呼叫父類被隱藏的方法;

           6,super()與this()具備硬性使用條件,否則編譯無法通過——Constructor call must be the first statement in a constructor.即

                   二者出現的位置必須是構造方法的第一行

           7,super()與this()並不像super.b與this.b一樣可以向下替代,因為子類並不能繼承父類的構造方法,僅僅是包含了父類的有參或無參構造器                      (預設無參);

           8,Implicit[不言明的,隱式的]super constructor Subject() is undefined. Must explicitly[明確地] invoke another constructor,這句話表明:

                  子類的構造方法中必須呼叫父類的構造方法,如果沒有顯式寫出super(),則預設呼叫父類的無參構造方法。但此時如果父類寫了有參的構                   造方法,編譯器就不會再為父類預設建立無參構造方法,此時super()沒有被定義,則必須在子類的構造方法中寫明super(引數)或者在父類                   中顯式寫出父類的無參構造方法;

例項:

父類

  1. publicclass Subject{    
  2.     public String a="我是父類全域性變數a";  
  3.     public String b="我是父類全域性變數b";  
  4.     publicvoid operation(){  
  5.         System.out.println("我是父類方法");  
  6.     };   
  7.     publicvoid operation1(){  
  8.         System.out.println("我是父類方法");  
  9.     };   
  10. }    
子類
  1. publicclass MySubject extends Subject {    
  2.     public String b="我是子類全域性變數b";  
  3.     @Override
  4.     publicvoid operation() {    
  5.         System.out.println(a);  
  6.         System.out.println(this.a);  
  7.         System.out.println(super.a);  
  8.     }    
  9.     @Override
  10.     publicvoid operation1() {    
  11.         String b="我是區域性變數b";  
  12.         System.out.println(b);  
  13.         System.out.println(this.b);  
  14.         System.out.println(super.b);  
  15.     }    
  16.     publicstaticvoid main(String[] args) {  
  17.         Subject sub=new MySubject();  
  18.         sub.operation();    
  19.         sub.operation1();    
  20.     }    
  21. }    
執行結果
  1. 我是父類全域性變數a  
  2. 我是父類全域性變數a  
  3. 我是父類全域性變數a  
  4. 我是區域性變數b  
  5. 我是子類全域性變數b  
  6. 我是父類全域性變數b