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(引數)或者在父類 中顯式寫出父類的無參構造方法;
例項:
父類
- publicclass Subject{
- public String a="我是父類全域性變數a";
- public String b="我是父類全域性變數b";
- publicvoid operation(){
- System.out.println("我是父類方法");
- };
- publicvoid operation1(){
- System.out.println("我是父類方法");
- };
- }
- publicclass MySubject extends Subject {
- public String b="我是子類全域性變數b";
- @Override
- publicvoid operation() {
- System.out.println(a);
- System.out.println(this.a);
- System.out.println(super.a);
- }
- @Override
- publicvoid operation1() {
- String b="我是區域性變數b";
- System.out.println(b);
- System.out.println(this.b);
- System.out.println(super.b);
- }
- publicstaticvoid main(String[] args) {
- Subject sub=new MySubject();
- sub.operation();
- sub.operation1();
- }
- }
- 我是父類全域性變數a
- 我是父類全域性變數a
- 我是父類全域性變數a
- 我是區域性變數b
- 我是子類全域性變數b
- 我是父類全域性變數b