Java中的动态方法查找

我试图让我的头在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()方法时,为什么它会调用属于超类的方法,而不是子类中的方法,即使在我用子类初始化对象时也是如此。
我一直认为动态调用用来以这种方式工作,即你初始化对象的类,该类的方法被调用,即基本上重写的方法应该被调用,而不是父方法。

迪内希


错字。

public void somFunction(){

应该

public void someFunction(){

正如leonbloy在评论中所说,如果将注释@Override放在方法之前,编译器会编译时检查它是否实际覆盖了某些内容。 所以如果它的方法名称是一个错字(或者它覆盖了更改签名的方法),它将不会编译:

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

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

链接地址: http://www.djcxy.com/p/78801.html

上一篇: Dynamic Method Lookup in Java

下一篇: Java Inheritance: Overwritten or hidden methods