Java中的动态方法查找

时间:2013-05-06 01:16:45

标签: java inheritance method-overriding method-invocation

我试图了解java中的Dynamic方法调用并且无法理解为什么java不允许我从子类调用方法而不是超类方法。

例如: 如果我有2个课程TestTest2。 Test2 继承

中的

在子类中重写方法someFunction()

测试类

public class Test {

    public Test(){
        System.out.println("I am Test class constructor called with no values");
    }

    public void someFunction(){
        System.out.println("I am some function belonging to Test Class");
     }
  }

和Test2类:

public class Test2 extends Test{

    public Test2(){
       System.out.println("Constructor of Test2 with no values");
    }

    public void somFunction(){
        System.out.println("I am someFunction overridden in Test2");
    }
}

所以当我尝试以这种方式实例化Test类时:

    Test t1 = new Test2();
    t1.someFunction(); // this should call Test2.someFunction()

我得到的输出是:

I am Test class constructor called with no values
Constructor of Test2 with no values
I am some function belonging to Test Class

所以我的问题是:  当我使用someFunction()调用方法object t1时,为什么它调用属于超类的方法而不是子类中的方法,即使我使用子类初始化对象也是如此。
我一直认为动态调用曾经以这种方式工作,即初始化对象的类,该类的方法被调用,即应该调用基本覆盖的方法而不是父方法。

的Dinesh

2 个答案:

答案 0 :(得分:7)

错字。

public void somFunction(){

应该是

public void someFunction(){

正如leonbloy在评论中所说,如果在方法之前放置注释@Override,编译器将编译时检查它实际上是否覆盖了某些内容。因此,如果它的方法名称是拼写错误(或者如果它覆盖了更改签名的方法),它将无法编译:

@Override public void somFunction(){ //compile time error

答案 1 :(得分:0)

你的类Test2中有一个拼写错误(somFunction而不是someFunciton)而你没有覆盖该函数,而是你有新的函数somFunction。