我想用Java创建自己的数据库程序。我知道已经有解决方案,例如sylite等,但我想自己做。由于事实证明它比最初预期的要复杂,因此我使用了大量继承来保持概述。例如:
RawStreamManager
,用于使用FileOutputStream
处理流到文件SessionManager
,以防止使用某种csma / cd策略进行多重访问但是,我现在的问题是,当我调用例如方法SessionManager
。我想这是有充分的理由的,但是在我的情况下,当客户端没有令牌时,弄清楚客户端拥有权限并将字符串拆分成数据库是没有意义的(读/无需多次访问即可写)。因此,我正在寻找一种方法来调用read()
的{{1}}方法(还有一些我需要的情况),而不是子类read()
方法
我已经尝试在调用read()
之前将SessionManager
强制转换为read()
对象,但这无济于事。
一种解决方法是为这些方法赋予不同的名称。
为了给大家展示一些代码,而又不打扰我,我在这里简化了数据库代码:
SessionManager
SessionManager
现在我希望输出为:
read()
但是(第3行):
public class First {
public First() {
System.out.println("syso from first:");
((First) this).print();
}
public void print() {
System.out.println("FIRST");
}
}
那么,请问您中有人可以解决该问题吗? 预先谢谢你。
答案 0 :(得分:3)
由于您正在创建Second
类的实例,因此,在调用Second
的构造函数时,将隐式调用对超类构造函数First()
的调用,以隐式调用。 super()
通话中的Second()
。
尽管您将类型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
中,我隐藏了,但没有覆盖基类print()
的{{1}}。
答案 1 :(得分:0)
在@Amardeep Bhowmick回答之后,可能在某些情况下您可能不希望该方法为静态方法。我相信问题本身更多地与代码组织有关。避免在类构造函数中调用方法:
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()