java - Java 中的动态方法查找

标签 java inheritance overriding method-invocation

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

例如: 如果我有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

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

迪内什

最佳答案

打字错误。

public void somFunction(){

应该是

public void someFunction(){

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

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

关于java - Java 中的动态方法查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390792/

相关文章:

python - 如何创建从外部库中的 sqlalchemy 模型继承的自定义类

javascript - 原型(prototype)继承调用构造函数两次

java - 重写而不调用父方法,违反了里氏原则

JavaBeans - 变量的 getProperty

java - 如何在JTable中显示某些行

java - 使用 Apache Ant 清理陈旧的 .class 文件

javascript - 这在 JavaScript 子类中不可用

java - 将 1 传递给多个相同对象类型的参数

inheritance - Scala函数的方差和覆盖

java - 为什么当我关闭 Activity 时总是发出火警警报