簡體   English   中英

從超類中調用超級方法

[英]Calling super method from within super class

作為一個扭轉腦子的例子,我的一位教授給了我們以下練習,以了解繼承。 我們必須弄清楚輸出。

//java
public class A {
    public void f() {
        System.out.println("A -> f()");
        x = x + 4;
        if (x < 15) this.f(); //the f-call
    }
    public int x = 5;
}

public class B extends A {
    @Override
    public void f() {
        System.out.println("B -> f()");
        x = x + 3;
        super.f();
    }
}

public class Main {
    public static void
    main(String[] args) {
        A a = new B();

        System.out.println("a.f()");
        a.f();
        System.out.println(a.x);
    }
}

正如我所料,輸出是

  • AF()
  • B - > f()
  • A - > f()
  • B - > f()
  • A - > f()
  • 19

但是,我現在想知道。 有沒有辦法在A中調用f調用 A中的f方法,即使我從B對象使用它,類似於我使用super.f()從B中調用f的方式。 所以輸出會變成(我認為):

  • AF()
  • B - > f()
  • A - > f()
  • A - > f()
  • 16

這可能嗎? 如果是這樣,怎么樣?

注意:我不確定這個實際應用是什么,我只是想學習一些新東西:P

簡短的回答是“不”你不能這樣做。

更長的答案是允許這會破壞對繼承的各種保證。 你的B類基本上說“我現在為public void f()提供規范方法”。 因為B提供了所述方法,所以允許回調父母使用它(以及這是非常有用的事情)。

如果A被允許做同樣的事情,它基本上會繞過B想要覆蓋的行為。

有多種模式可以為您提供類似的行為,例如模板模式

由於多態性將適用於一個超類對象的所有方法中, f被稱為將是永遠對象的運行時類型的-在這種情況下, B ,所以Bf方法將總是被調用。 這在Java中是無法改變的。

您可以通過在private方法(例如foo執行Af方法來解決此問題,以便在調用f時,重復調用foo A

public void f()
{
   foo();
}

private void foo() {
    System.out.println("A -> f()");  // Lie.
    x = x + 4;
    if (x < 15) this.foo(); //the "f"-call
}

暫無
暫無

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

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