我试图了解java中的动态方法调用,但无法理解为什么java不允许我从子类调用方法而不是父类(super class)的方法。
例如:
如果我有2节课Test
和Test2
。 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/