我想用 Java 创建自己的数据库程序。我知道已经有像 sylite 等解决方案,但我想自己做。事实证明这是一个比最初预期的更复杂的程序,我使用了很多继承来保持概览。例如:
- 第一个类是
RawStreamManager
,使用FileOutputStream
处理流到文件 - 第二个类是
SessionManager
以防止使用某种 csma/cd 策略进行多次访问 - 还有一些类可以做其他事情。
但是,我现在的问题是,当我调用例如方法 read()
。我想这是有充分理由的,但就我而言,当客户端没有 token (允许读取/没有多次访问的写入)。所以我正在寻找一种方法来调用 SessionManager
的 read()
方法(还有一些我需要的情况)而不是子类 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
类中,我隐藏并且没有覆盖基类 First
的 print()
。
关于java - 有没有办法在调用的时候不调用子类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57521886/