方法覆盖如何工作?

时间:2014-07-03 14:17:07

标签: java method-overriding

请查看以下代码段:

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的对象是在运行时创建的。我在想正确的方向吗?

4 个答案:

答案 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中的实现。把事情简单化。你是对的。