【发布时间】:2020-11-28 11:46:07
【问题描述】:
我是 java 新手,我通常使用 c++ 我只是想知道这段代码是否有效
public class ParentClass {
public void methodA() {
System.out.println("This is Parent A Method");
whoAmI();
}
public void methodB() {
System.out.println("This is Parent B Method and I am Calling Method A");
whoAmI();
methodA();
}
}
public class ChildClass extends ParentClass{
@Override
public void methodA() {
System.out.println("This is Child A Method and I am Calling Parents Method A");
whoAmI();
super.methodA();
}
@Override
public void methodB() {
System.out.println("This is Child B Method and I am Calling Parents Method B");
whoAmI();
super.methodB();
}
}
ChildClass c = new ChildClass();
c.methodB();
我期望这样的输出
This is Child B Method and I am Calling Parents Method B
This is Parent B Method and I am Calling Method A
This is Parent A Method
但是
This is Child B Method and I am Calling Parents Method B
This is Parent B Method and I am Calling Method A
This is Child A Method and I am Calling Parents Method A
This is Parent A Method
所以我意识到在 java 中所有非静态方法都是默认的虚函数,如 c++ 中的 virtual 关键字。
有什么办法可以这样输出吗?
This is Child B Method and I am Calling Parents Method B
This is Parent B Method and I am Calling Method A
This is Parent A Method
【问题讨论】:
-
代码 - 按原样 - 不会编译。方法
whoAmI()未定义。 -
他只是忘了给我们看,没什么大不了的
-
如果你想总是在
Parent的methodB中调用Parent类的methodA,那么你可以在Parent中声明methodA为final或private,防止它被覆盖。如果这不是一个选项,那么由于dynamic dispatch(我的C++知识有点生疏,但iirc,C++中的行为应该是一样的),那么就没有办法做你想做的事。 -
whoAmI() 只是简单的显示功能。 public void whoAmI() { System.out.println("我是 B 的实例"); }
-
这里唯一的问题是为什么你期望输出。这是不正确的,只要方法是
virtual(Java 中的默认值),C++ 的行为方式与此处的 Java 相同。
标签: java class inheritance virtual