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

从基类方法调用基类重写的函数

公冶渝
2023-03-14
问题内容
public class A {
    public void f1(String str) {
        System.out.println("A.f1(String)");
        this.f1(1, str);
    }

    public void f1(int i, String str) {
        System.out.println("A.f1(int, String)");
    }
}



public class B extends A {
    @Override
    public void f1(String str) {
        System.out.println("B.f1(String)");
        super.f1(str);
    }

    @Override
    public void f1(int i, String str) {
        System.out.println("B.f1(int, String)");
        super.f1(i, str);
    }
}


public class Main {
    public static void main(String[] args) {
        B b = new B();
        b.f1("Hello");
    }
}

我正在寻找此代码将输出:

B.f1(String)
A.f1(String)
A.f1(int, String)

但是我得到了:

B.f1(String)
A.f1(String)
B.f1(int, String)
A.f1(int, String)

我了解在B的上下文中,A.f1(String)中的“
this”是B的实例。我是否可以选择执行新的链B1()。f1(String)->(A’s)f1(String)->(A’s)f1(int,String)?

这是一个理论问题,实际上,解决方案显然是在A中实现f1(String)和f1(int,String)都将调用的私有函数。

谢谢你,
马克西姆。


问题答案:

抱歉不行

如您所知,但是为了完整起见,我将明确声明-只有2个关键字可以控制方法调用:

  • - this.method()从调用实例的类开始查找方法(实例的“顶部”虚拟表-隐含默认值)
  • 超级 - super.method()从定义了调用方法的类的父类开始查找方法(调用类的父级的虚拟表- 并非严格为true,但更容易想到这种方式-谢谢@maaartinus)

我可以想象另一个关键字(例如,当前关键字)执行您所描述的操作:

  • 当前 - current.method()从定义调用方法的类开始查找方法

但是Java没有这样的关键字(还可以吗?)。



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

  • 问题内容: 我有以下代码片段: 执行代码时出现异常: 我不明白为什么会有和例外。有人可以帮助我理解吗? 您可以在此处检查代码。 问题答案: 创建一个对象,这意味着首先调用其超类构造函数,然后依次调用-但您已覆盖它,因此它是该方法的子版本。在该方法中,您调用尚未初始化的。 结论:在构造函数中调用可重写方法几乎从来不是一个好主意。

  • 问题内容: 我有两个Java类:B,它扩展了另一个类A,如下所示: 我想打电话给。我来自C++界,我不知道如何用Java做这个基本的事情。 问题答案: 您要寻找的关键字是。例如,请参阅本指南。

  • 问题内容: 如果我有一个python类为: 然后定义一个子类,例如: 如果基类的init函数接受某些参数,而我将它们作为子类的init函数的参数,则如何将这些参数传递给基类? 我写的代码是: 我要去哪里错了? 问题答案: 你可以用 您的缩进不正确,这是修改后的代码: 这是输出:

  • 我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出:

  • 问题内容: 请参考下面的Java代码: 看到的输出是: 我认为发生var = 0是因为派生对象已初始化一半;类似于乔恩·斯基特在这里说的话 我的问题是: 如果尚未创建Derived类对象,为什么要调用重写的方法? var在什么时间点分配值为0? 是否有任何需要这种行为的用例? 问题答案: 该对象 已 被创建-它只是在构造函数尚未运行。对象的类型在创建后即刻就不会在Java中更改,这发生在所有构造函