【问题标题】:Dynamic Method Lookup in Java [closed]Java中的动态方法查找[关闭]
【发布时间】:2013-05-06 01:16:45
【问题描述】:

我试图了解 java 中的动态方法调用,但无法理解为什么 java 不允许我从子类调用方法而不是超类的方法。

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

方法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

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

饭菜

【问题讨论】:

    标签: java inheritance overriding method-invocation


    【解决方案1】:

    错字。

    public void somFunction(){

    应该是

    public void someFunction(){

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

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

    【讨论】:

    • 为避免此类错误,请使用@Override 注解
    【解决方案2】:

    您的 Test2 类中有拼写错误(somFunction 而不是 someFunciton),并且您没有重写该函数,而是有新的函数 somFunction。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多