有没有办法在调用的时候不调用子类的方法?

Is there a way not to call the subclass method when invoking?

我想在 Java 中创建自己的数据库程序。我知道已经有像 sylite 等解决方案,但我想自己做。事实证明这是一个比最初预期的更复杂的程序,我使用了很多继承来保持概览。例如:

然而,我现在的问题是,当我调用例如方法 read()。我想这是有充分理由的,但在我的例子中,当客户端没有令牌(允许 read/write 没有多重访问)。所以我正在寻找一种方法来调用 SessionManagerread() 方法(还有一些我需要的情况)而不是 subclasses read() 方法

我已经尝试在调用 read() 之前手动将 SessionManager 转换为 SessionManager 对象,但这没有帮助。 一种解决方法可能是为这些方法指定不同的名称。

为了向你们展示一些代码,而不是在这里放弃我的数据库代码,我简化了问题:

public class First {
    public First() {
        System.out.println("syso from first:");
        ((First) this).print();
    }

    public void print() {
        System.out.println("FIRST");
    }
}
public class Second extends First{
    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        System.out.println("syso from second:");
        print();
    }

    @Override
    public void print() {
        super.print();
        System.out.println("SECOND");
    }
}

现在我希望输出为:

syso from first:
FIRST
syso from second:
FIRST
SECOND

但它是(第 3 行):

syso from first:
FIRST
SECOND
syso from second:
FIRST
SECOND

那么,请问你们中有谁能解决这个问题吗? 提前谢谢你。

由于您正在创建 Second class 的实例,因此当 Second 的构造函数被调用时,将调用超级 class 构造函数 First() 被隐式调用,因为 Second() 调用中 super() 的隐式调用。

尽管您已将 this 类型转换为 First,但由于 的性质,它仍将调用 Second class 的覆盖方法dynamic/runtime Java 中的多态性 。在运行时,JVM 检查实例并调用其方法而不是引用的方法。

为了避免并给出预期的输出,您需要将打印方法设为静态或完全使用不同的方法名称:

class First {
    public First() {
        System.out.println("syso from first:");
        First.print();
    }

    public static void print() {
        System.out.println("FIRST");
    }
}
 class Second extends First{
    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        System.out.println("syso from second:");
        Second.print();
    }


    public static void print() {
        First.print();
        System.out.println("SECOND");
    }
}

输出:

syso from first:
FIRST
syso from second:
FIRST
SECOND

静态版本给出了预期的输出,因为在静态 属于 的情况下,方法属于 class 而不是实例。在 class Second 中,我 隐藏了 并且没有覆盖基础 class First.[= 的 print() 23=]

根据@Amardeep Bhowmick 的回答,在某些情况下您可能不希望该方法是静态的。我相信问题本身更多是关于代码组织的。避免在 class 构造函数本身中调用方法:

public class First {
    public First() {
        System.out.println("syso from first:");
    }

    public void print() {
        System.out.println("FIRST");
    }
}

public class Second extends First{

    public static void main(String[] args) {
        new Second();
    }

    public Second() {
        super.print();
        System.out.println("syso from second:");
        this.print();
    }

    @Override
    public void print() {
        super.print();
        System.out.println("SECOND");
    }
}

唯一的区别是您在构造函数之外调用函数,而不是在实例化 First 时调用函数,例如 new First().print()