我有三种不同的课程:
1-)
abstract class A {
abstract void one();
void two(){
System.out.println("two");
one();
}
abstract void three();
}
2-)
abstract class B extends A {
void one() {
System.out.println("one");
three();//I think this method has to run
}
void three() {
System.out.println("3");//That
}
}
3-)
public class C extends B {
void three(){
System.out.println("three");
}
}
在Main方法中
public static void main(String [] args){
C c=new C();
c.one();
c.two();
c.three();
}
输出:
one
three
two
one
three
three
但是我认为在第二个代码中,one()方法必须运行其三个方法,并且必须显示“ 3”而不是“三个”,但是此代码在C类中运行三个。
答案 0 :(得分:1)
在B类和C类中,three()方法都被覆盖
由于c是C类的实例,因此任何对带有c对象的three()方法的引用都将调用C类中的three()实现。
答案 1 :(得分:1)
three()
中的C
方法被覆盖。由于c
拥有C
的实例,因此您将看到输出。
答案 2 :(得分:0)
java中的重写始终基于引用“ c”中的目标对象进行。因此,首先,它将在C类中使用three()方法的任何可用重写版本,否则,将执行后续的父类版本。