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

标签 java inheritance methods subclass

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

  • 第一个类是 RawStreamManager,使用 FileOutputStream 处理流到文件
  • 第二个类是 SessionManager 以防止使用某种 csma/cd 策略进行多次访问
  • 还有一些类可以做其他事情。

但是,我现在的问题是,当我调用例如方法 read()。我想这是有充分理由的,但就我而言,当客户端没有 token (允许读取/没有多次访问的写入)。所以我正在寻找一种方法来调用 SessionManagerread() 方法(还有一些我需要的情况)而不是子类 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 类的实例,因此当 Second 的构造函数被调用时,将调用父类(super class)构造函数 First() 被隐式调用,因为 Second() 调用中隐式调用了 super()

尽管您将 this 类型转换为 First,但由于 Second 类的覆盖方法>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

静态版本给出预期的输出,因为在静态属于 的情况下方法属于类而不是实例。在 Second 类中,我隐藏并且没有覆盖基类 Firstprint()

关于java - 有没有办法在调用的时候不调用子类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57521886/

相关文章:

java - Java中如何清理CPU?

java - Hadoop 作业返回异常 "classNotFound"

java - JNI 不会在 cmake 环境中创建 jclasses

java - java中的继承.如何通过父类(super class)方法改变子类的变量值

c++ - C++ 中的动态链接不起作用

java - 如何使我的代码从菜单代码中的一个空白变为另一个空白,并使其随机生成输入?

java - 如何为 Spring 集成邮件配置动态入站?

Java acm、GRect方法、继承add方法不显示

java - Java 是否支持默认参数值?

java - 如何检查类名是否有效?