当前位置: 首页 > 面试题库 >

Java:在“这个”类而不是子类中调用函数(类似于“超级”)

元俊雅
2023-03-14
问题内容

在Java中,是否可以以始终执行“本地定义”版本而不是子类的重写版本的方式调用可重写方法?即有没有类似的super引用此类而不是超类的?

让我给出一个代码示例,希望可以清楚地说明我要执行的操作:

class A {
    void foo() {
        System.out.println("Foo from A");
    }

    void bar() {
        foo();  // <-- This is the important line!
    }
}

class B extends A {
    @Override
    void foo() {
        System.out.println("Foo from B");
    }
}

如果这样做new B().bar(),它将调用中bar()定义的方法A,该方法将foo()被覆盖B以打印“ B的Foo”。

有没有一种方法可以强制该bar()方法调用而不是中foo()定义的方法?就像我可以使用在调用中定义的方法?不幸的是,使用仍然会调用子类的版本。甚至类似或不起作用的东西。A``B``super.foo()``B``foo()``A``this.foo()``((A) this).foo()``A.this.foo()

显然,我可以简单地定义foo()in
的私有或最终版本,A然后调用它。但是我希望找到一个解决方案,我所要做的就是将上面代码示例中的“重要行”更改为一种不同的调用foo()的方式,以使其打印“
A上的Foo”,最好不要使用诸如反射之类的技巧。


问题答案:

要么将您的方法设为静态(baadddddd),要么更改您的设计。

确实,为子类提供默认行为是没有意义的,该子类被定义为适合于所关注的方法。

由于您的foo()方法似乎有所不同,因此您可以实施以下策略模式:

interface BarProcess{
    void foo();
}

public class DefaultBarProcess implements BarProcess{
    void foo() {
       System.out.println("Foo from A");
    }
}

public class AnotherBarProcess implements BarProcess{
    void foo() {
       System.out.println("Foo from B");
    }
}

class A {

    private BarProcess barProcess;

    public A(Bar barProcess){
      this.barProcess = barProcess;
    }

    void bar() {
        barProcess.foo();
    }
}

class B extends A {  //deprecated! No need to exist

}


 类似资料:
  • 问题内容: 让我们看一下这段代码: 我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法? 问题答案: 不会覆盖,因为它没有相同的形式参数。一个拿走,另一个拿走。因此,运行时的多态不会被应用,并且不会导致子类方法的执行。根据Java语言规范: 如果满足以下所有条件,则在类C中声明或由类C继承的实例方法从类C中 重写 另一个在类A中声明的方法:

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 问题内容: 我想在超类中实现,并通过在运行时在超类中的特定子类上调用类方法在所有子类中使用它。 MySuperClass 子类是否有可能在运行时访问类函数? 问题答案: 我想我明白了你的意思。您创建一个类,实现一个初始化程序和一个类(静态)函数: 接下来,您要创建子类,并让初始化程序调用该方法的重写版本。您只需要重写该方法即可: 现在,当您创建的实例时,显示的内容是: 这是预期的输出。 请注意,初

  • 问题内容: 考虑以下代码 在我看来,目前有两种方法可以避免这种问题。 要么上A班最后一班。 要么 使getVar方法最终化 作者试图提出防止上述问题的方法。但是,该解决方案似乎很麻烦,因为要遵循一些规则。 http://benpryor.com/blog/2008/01/02/dont-call-subclass-methods-from-a- superclass-constructor/ 除了

  • 问题内容: 这是在本地处理程序的上下文中。我想运行一个外部程序来获取一些数据。我可以使用popen()或等效函数吗? 问题答案: 然后,您可以使用流读取和写入数据。

  • 为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它? 我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。 我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。