我有以下java代码。
class A {
public void method1() {
System.out.println("A 1");
method2();
}
public void method2() {
System.out.println("A 2");
}
}
class B extends A {
@Override
public void method2() {
System.out.println("B 2");
}
}
public class Tester {
public static void main(String[] args) {
A a = new B();
a.method1();
}
}
打印
A 1
B 2
答案 0 :(得分:3)
由于方法method1(...)
从未被覆盖,因此B继承了A method1()
,并且它被调用,好像它是在B中定义的那样。
自从method1()
调用method2()
时,调用B中定义的重写方法method2()
,当使用B构造函数创建实例时。
如果使用A构造函数创建另一个实例,则不会在B中定义被覆盖的method2(...)
,但会获得在A中定义的原始method2(...)
。
答案 1 :(得分:0)
调用a.method1()时运行时到底发生了什么?
A类的方法1()被称为。
如何从父级调用派生方法?
由于你已经在类B中使用了方法method2
,这将是将在运行时调用的方法。
是否在查看对象和方法名称字符串并在运行时调用该方法?
不要在这里混淆。当你写
A a = new B();
如果它们被淘汰,则会调用来自B类的方法,否则将调用来自A的方法。
默认是调用this.method2()吗?
同样,它不是默认的。如果你从它那里得到它,那么它就会从B中调出来。如果你不是从它那里调来的,那就是从A中调用它。
答案 2 :(得分:0)
因为您的对象实际上是继承自B
的{{1}}类型。在你的A
课程中,你重写了方法2,这就是它调用B
的原因
B.method2()
要从 A a = new B();
致电method2
,请使用:
A
答案 3 :(得分:0)
当初始化类型B的对象时,它是B类的一个实例,即使它被隐式地强制转换为类型A的对象。
因此,当您调用a.method1()
时,因为{B}中未定义method1()
,它会调用基类中定义的方法。然后反过来调用method2()
时,它在类B中定义,因为对象是类型B,所以调用类B中的方法。
答案 4 :(得分:0)
您已创建了Object类的Object和类型为Reference的Object。 引用的类型为Parent(向下转换)
当您在引用上调用任何方法时,将调用类型引用的方法。但是如果该方法在引用类型中不可用,则将从Parent(继承)调用它。
在您的示例中,编译器检查对象A中的method1并在那里找到它。 第二当调用method2时,从当前的Object(对象B而不是参考A)调用它。
注意,因为当从A的引用中调用它时,方法2被覆盖,它将从对象A(父级)调用方法,如果从引用B调用它,它将从对象B(子级)调用。
这里要记住的关键点是Reference和Object的区别。它们都是不同的实体。
*如果从抽象类调用具体方法调用相同类的抽象方法,则会发生同样的事情。将调用子类的实现方法。