Java Can';即使引用对象指向子类对象,也不能重写该方法

Java Can';即使引用对象指向子类对象,也不能重写该方法,java,inheritance,Java,Inheritance,我有另一个示例程序,它确实重写了,但所有方法都有相同数量的参数 class A { int a; // function with dummy parameters void printArray(int i) { System.out.println("A"); } } class B extends A { //function with dummy parameters void printArray(int i, int

我有另一个示例程序,它确实重写了,但所有方法都有相同数量的参数

class A {
    int a;
    // function with dummy parameters
    void printArray(int i) {
        System.out.println("A");
    }
}

class B extends A {
    //function with dummy parameters
    void printArray(int i, int s) {
        System.out.println("B");
    }
}

public class JavaApplication5 {
    public static void main(String[] args) {
        A ob = new A();
        B o2 = new B();
        A o3;
        o3 = o2;
        o3.printArray(3, 2); // It says that it can not be applied to given type :(
    }
}

如果不希望出现任何错误,则需要告诉Java解释器o3能够通过强制转换调用printArray(3,2)。主要通过做

((B)o3).打印阵列(3,2)

此外,你所做的并不是凌驾于任何事情之上。(请注意,类A和类B中的方法参数不同)重写如下:

class A {
    int a;
    // function with dummy parameters
    void printArray(int i){
        System.out.println("A");
    }
}

class B extends A {
    //function with dummy parameters
    @Override
    void printArray(int i) {
        System.out.println("B");
    }
}

public class Example {
    public static void main(String[] args) {
        A ob = new A();
        B o2 = new B();
        A o3;
        o3 = o2;
        o3.printArray(3);
    }
}

这里不需要强制转换任何内容,因为类B重写类A中的方法。就Java解释器而言,类A和类B的任何实例都可以调用printArray,因此,对象o3是类A还是类B的实例并不重要。

如果您不关心问题的格式,则不要期望得到答案Java键入系统是静态的
o3
属于
A
类型,因此它无法访问双参数方法。代码中根本没有发生重写。您只是试图对类型a的变量调用仅在类B中定义的方法。