子類方法調用函數時使用的成員變量問題

問題拋出

我們在FriendshipGraph中繼承ConcreteEdgesGraph,然後我們在其中調用ConcreteEdgesGraph的方法,爲了加到自己的成員變量中,因此向FriendshipGrap中加入了成員變量:
private final Set vertices = new HashSet<>();
private final List

思考與解決

感覺應該是對繼承的方法理解不夠,通過學習得到:
通過老師在微信羣中給出的問題思考this到底指向哪個變量或方法。

//這段代碼中的主函數運行之後輸出什麼?
class T {
  void foo() {this.bar();}
  void bar() {System.out.println("T.bar");}
  public static void main(String args[]) {
         B b = new B();
         b.foo();
  }
}

class B extends T {
  void foo() {super.foo(); }
  void bar() {System.out.println("B.bar"); }
}

在這個例子中的輸出是“B.bar”。

//當代碼改動爲以下時:
class T {
  void foo() {this.bar();}
  void bar() {System.out.println("T.bar");}
  public static void main(String args[]) {
         B b = new B();
         b.foo();
  }
}

class B extends T {
  void foo() {super.foo(); }
  void barr() {System.out.println("B.bar");//將不再是重寫的方法
   }
}

在這個改動後的例子中的輸出是“T.bar”
再次嘗試這個代碼:

class A{
    int num = 1;   
    void show() {
        System.out.println(this.num);
    }
}
public class B extends A{
    int num = 2;   
    public static void main(String[] args) {
        B b = new B();
        b.show();
    }
}

這段代碼的運行結果爲“1”。
我們的this指向的是當前對象。我們可以使用this來解決成員變量和參數重名的情況。Java中只有Method有多態的特徵,可以被覆蓋,而Field不可以被覆蓋,如果Field重名,具體調用哪個,與引用類型有關。

結論

1.當使用子類對象調用方法使用同名變量,是按照方法來判斷使用哪一個變量,調用父類的方法,使用的是父類中的變量,調用子類的方法,使用的是子類中的變量。
2.子類重寫父類方法時,子類調用時使用的是子類的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章