请查看以下代码段:
class A
{
void fun1()
{
System.out.println("fun1 of A");
fun2();
}
void fun2()
{
System.out.println("fun2 of A");
}
}
class B extends A
{
void fun2()
{
System.out.println("fun2 of B");
}
}
在main方法中:
A a=new B();
a.fun1()
输出结果为:
fun1 of A
fun2 of B
请解释一下这个输出。
据我所知a.fun1
正在调用fun1
的{{1}},因为A
未覆盖fun1
(否则会调用B
fun1
)。并且B
fun2()
fun1
中的A
正在调用fun2
B
,因为fun2
被覆盖,而B的对象是在运行时创建的。我在想正确的方向吗?
答案 0 :(得分:2)
已经回答了,但我还是把它作为答案,因为我反对简化示例代码,我无法在评论中正确表达。使用A和B等名称以及fun()确实无法让任何人理解任何事情,包括你自己。试试这个:
class Animal {
public void makeSound(){
System.out.println("<silence>");
}
}
class Cow extends Animal {
public void makeSound(){
System.out.println("Moooooooo");
}
}
public class Test {
public static void main(String[] args){
Animal animal = new Cow();
animal.makeSound(); // what sound is the animal going to make?
}
}
如果你使用的东西&#34;现实&#34;这很容易想象,它突然变得几乎不言自明。
注意:我故意遗漏对abstract关键字的任何引用,因为这不在此问题的上下文中。
答案 1 :(得分:1)
您的理解大多是正确的。请记住,Java中的所有函数都是虚函数,并且将根据您正在使用的对象的运行时类型调用方法。诀窍是当你fun2();
时,隐含的this
会变成this.fun2()
。由于您的exapmle this
指向类B
的对象,因此将调用overriden方法。
答案 2 :(得分:0)
是。没有什么比说你的解释是正确的了。
答案 3 :(得分:0)
A a=new B();
该行表示在调用时获取类型B
中的实现。把事情简单化。你是对的。