有没有办法在调用的时候不调用子类的方法?
Is there a way not to call the subclass method when invoking?
我想在 Java 中创建自己的数据库程序。我知道已经有像 sylite 等解决方案,但我想自己做。事实证明这是一个比最初预期的更复杂的程序,我使用了很多继承来保持概览。例如:
- 第一个 class 是
RawStreamManager
使用 FileOutputStream
处理文件流
- 第二个 class 是
SessionManager
以防止使用某种 csma/cd 策略 的多重访问
- 还有一些class可以做其他事情。
然而,我现在的问题是,当我调用例如方法 read()
。我想这是有充分理由的,但在我的例子中,当客户端没有令牌(允许 read/write 没有多重访问)。所以我正在寻找一种方法来调用 SessionManager
的 read()
方法(还有一些我需要的情况)而不是 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()
我想在 Java 中创建自己的数据库程序。我知道已经有像 sylite 等解决方案,但我想自己做。事实证明这是一个比最初预期的更复杂的程序,我使用了很多继承来保持概览。例如:
- 第一个 class 是
RawStreamManager
使用FileOutputStream
处理文件流
- 第二个 class 是
SessionManager
以防止使用某种 csma/cd 策略 的多重访问
- 还有一些class可以做其他事情。
然而,我现在的问题是,当我调用例如方法 read()
。我想这是有充分理由的,但在我的例子中,当客户端没有令牌(允许 read/write 没有多重访问)。所以我正在寻找一种方法来调用 SessionManager
的 read()
方法(还有一些我需要的情况)而不是 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()