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

强制调用基类方法

何涵育
2023-03-14
问题内容

下面的代码在运行时显然会打印出“ B1 / A2 / B2”。现在,是否可以改为打印“ A1 / A2 /
B2”(即A#method2()应该在A而不是B上调用method1())?

注意:我不需要获得传递多态性,这个问题仅出于好奇。

class A {
    public void method1() {
        System.out.println("A1");
    }

    public void method2() {
        method1();
        System.out.println("A2");
    }
}

class B extends A {
    @Override public void method2() {
        super.method2();
        System.out.println("B2");

    }

    @Override public void method1() {
        System.out.println("B1");
    }
}

public class Tmp {
    public static void main(String args[]) {
        B b = new B();
        b.method2();
    }
}

问题答案:

是的,您可以做到。在包 a中 定义A :

package a;
public class A {
    void method1() {
        System.out.println("A1");
    }
    public void method2() {
        method1();
        System.out.println("A2");
    }
}

在包 b中 定义B :

package b;
import a.A;
public class B extends A {
    @Override public void method2() {
        super.method2();
        System.out.println("B2");
    }
    void method1() {
        System.out.println("B1");
    }
}

将测试放入软件包 a中 并运行它。结果是A1 / A2 / B2。当然这是不健康的:请注意在method1上@Override的必要省略-
如果将其放回原位,则会出现编译器错误:

method does not override or implement a method from a supertype


 类似资料:
  • 我试图用getter方法而不是字段来强制hibernate使用setter,但没有成功 我试图在字段上使用,但不起作用 如何强制hibernate调用setter方法填充类字段?

  • 问题内容: 这是我的情况: 逻辑很简单。“ SomeBaseClass”是我无法修改的第三方工具。我想限制其功能,并且不想允许foo(String strs [])。 问题是在SomeBaseClass内部foo(Sting str)内部调用foo(String strs [])。因此,当我调用MyClass的foo(String str)时,出现运行时异常。我该如何告诉SomeBaseClass

  • 所以,基本上我创建了一个包装器类,它创建了一个简单的OpenGL应用程序。我的想法是在准备好的时候有这样的东西: 所以,基本上这个类使用GLFW封装了一个简单的OpenGL窗口。这个想法是,当你想要创建一个新的应用程序时,你只需要从应用程序类(我正在写的)派生你的类。使用这个新类,您只需重写虚拟方法(main Loop、初始化和回调),您将拥有一个工作应用程序。 下面是基类: 所以我所做的是将在派

  • 问题内容: 我正在寻找此代码将输出: 但是我得到了: 我了解在B的上下文中,A.f1(String)中的“ this”是B的实例。我是否可以选择执行新的链B1()。f1(String)->(A’s)f1(String)->(A’s)f1(int,String)? 这是一个理论问题,实际上,解决方案显然是在A中实现f1(String)和f1(int,String)都将调用的私有函数。 谢谢你, 马克

  • 我正在制作一个Java类,在这个类中,我可以用DTO对列表应用一个过滤器(searchterms)。筛选器如下所示: 在我的类中,我有以下方法,将所有筛选器应用到列表: 但是根据字段的类型有不同的实现。与字符串类似,我创建了一个正则表达式: 但就像一个Float我想要另一个比较,我不想应用正则表达式到一个Float。要确保根据字段的类型调用正确的方法,最好的方法是什么?

  • 问题内容: 我想知道,当创建新类然后覆盖该方法时,在eclipse中我总是会自动添加:。这是怎么发生的?在抽象类或父类中是否有Java关键字会强制这样做? 我不知道不调用父类是否违法,但是我记得在某些方法中,我没有这样做就引发了异常。这也是Java内置的吗?您可以使用某些关键字来做到这一点吗?或如何完成? 问题答案: 这是-几乎所有评论的来源(原始- 参见〜800行 ): 因此,我的猜测是ADT