簡體   English   中英

如何訪問基類方法?

[英]How to access base class method?

簡化演示代碼以顯示我的問題。

class Base {
   public String toString() { return "Base"; }
};
class A extends Base {
   public String toString() { return "A"; }
};

class Test {
  public void test1() {
    A a = new A();
    Base b = (Base)a;    // cast is fine, but b is the same instance as a
    System.out.println(b.toString()); // want "Base", but get "A"
  } 

  private String testB(Base b) {
    return b.toString();   // this should return "Base"
  }   
  public void test2() {
    System.out.println( testB(new A()) );  // want "Base", but get "A"
  } 

};

我嘗試了強制轉換方法(test1)和輔助方法(test2)。

到目前為止,我發現需要Base的復制構造函數來創建一個真正的Base對象。

有沒有一個不需要重復對象的方法?


一些背景信息:

我得到一個A的實例,我知道它的基類有一個很好的方法,我想使用它而不是覆蓋的版本。 我寧願既不修改A類也不修B(雖然副本c'tor無論如何都是一個很好的增強;))

直接從A類,你可以使用super.toString(); Base上執行toString()

但是,從A類外部,您無法以這種方式調用超類實現,這樣做會破壞封裝。 如果你想暴露超類實現,那么你仍然可以,但你必須在A上提供一個直接公開它的單獨方法。

即使使用基於瑣碎反射的方法, 您仍然無法訪問它:

如果底層方法是實例方法,則使用動態方法查找調用它

System.out.println(Base.class.getMethod("toString", null).invoke(new A(), null)); //Prints "A"

...並且使用MethodHandles.lookup().findSpecial將無法在子類外部工作,因為必須在您具有私有訪問權限的情況下調用它(否則您將獲得IllegalAccessException 。)

我承認,如果沒有字節碼操作,我可能會直接在Java中使用一些奇怪而奇妙的方法,但是,即使你可以這樣做,你也應該這樣做,你當然不應該做任何事情。奇特的技術演示。

你需要創建B實例(復制構造函數),如果你使用的是A實例,無論你是否使用它都會得到“A”。

暫無
暫無

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

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