簡體   English   中英

在子類的方法中本地調用超類方法時,使用“ super”關鍵字還是使用超類實例?

[英]Using “super” keyword or using a superclass instance when calling superclass methods locally in a method from subclass?

假設我有:

class Superclass {
  //fields...

  methodA() {...}

  methodB() {...}

...
}

class Subclass extends Superclass {
   //fields...

   methodA() {
      // Here I need to call methods A and B from superclass:
      // For this, I can use supper
      super.methodA();
      super.methodB();

      // Or I have to instantiate the superclass and use the instance
      Superclass superclass = new Superclass();
      superclass.methodA();
      superclass.methodB();
}

它可以雙向工作,但是我想知道哪種更好。 這些方法中的任何一種都是不好的編程技術嗎? 我希望你能給我答案和論點。

  super.methodA();

  Superclass superclass = new Superclass();
  superclass.methodA();

這兩個對methodA的調用在不同的實例上工作,因此它們是完全不同的。 super.methodA()執行methodA在當前實例。 superclass.methodA()在與當前實例無關的新Superclass實例上執行methodA

您幾乎總是使用第一個選項。 至於第二個選項,創建一個新實例,在該實例上調用一個方法,然后再也不對該實例做任何事情是沒有意義的。

它可以雙向工作,但是我想知道哪種更好。

好吧,這完全取決於您要實現的目標。 如果創建一個新的,完全獨立的實例,請執行此操作。 但是,更常見的是,您想在被覆蓋的方法當前正在執行的同一實例上使用被覆蓋的方法的超類實現,在這種情況下,您將使用super.methodA()

以我的經驗,當重寫某個方法來執行某些特定於子類的工作,調用超類實現,然后執行一些特定於超類的工作時, super最常使用。 例如:

@Override public void add(Foo foo) {
    doSomeSubclassSpecificValidation(foo);
    super.add(foo);
    doSomeSubclassSpecificBookKeeping();
}

換句話說,即使您覆蓋了該方法,您仍然想要“正常”行為-您只希望同時運行一些額外的代碼。 或者有時您想有條件地運行超類代碼,例如,僅當輸入滿足特定條件時才運行。

完全不同。

super.methodA()將在左側的圓圈中調用super.methodA() ,同時創建一個新的超類並調用該methodA()將首先創建右側的圓圈,然后從中調用方法。

通過上面的回答,您必須了解,基本上,您在調用同一類的相同方法,但是在兩個不同的對象上,所以這都取決於您要實現的目標(您打算在哪個對象上調用這些方法)。 如您所知,對相同類的相同方法的調用在不同實例上是不同的。 “ super”對象是“ this”對象的父對象,並且在實例化Subclass時隱式創建了該super對象,因此根據您的示例代碼,兩者都不相同,但在簡單情況下,輸出可能相同。 再上一層,看看它是否與客戶端代碼看起來不同(嘗試編寫Subclass的調用代碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM