java - 将子类保存为父类(super class)类型并在 Java 中使用其方法

标签 java inheritance subclass superclass

在下面的代码中,子类扩展了其父类(super class),并重写了其方法,使用它来调用子类特有的另一个方法,该方法使用子类的变量。

程序然后将子类的实例存储到父类(super class)类型的变量中,然后调用其方法。然后它就像子类类型一样运行,调用子类特有的方法和变量。但是,无法直接访问这些。

class Superclass {
    void go() {
        System.out.println(0);
    }
}

class Subclass extends Superclass {
    int i = 1;

    @Override
    void go() {
        run();
    }

    void run() {
        System.out.println(i);
    }
}

public class JavaApplication {
    public static void main(String[] args) {
        Superclass instance = new Subclass();

        instance.go();                 // outputs 1; it must have called run() and accessed i
        instance.run();                // causes compile-time error
        System.out.println(instance.i);// causes compile-time error
    }
}

一旦子类实例保存为父类(super class)类型,它仍然可以访问所有子类字段和方法。那么为什么我不能直接访问它们呢?

最佳答案

对于变量和静态方法,根据引用的类型调用方法,而不是根据引用的对象调用方法。

但是在实例方法的情况下,该方法是根据被引用的对象的类型调用的,而不是根据引用的类型

关于java - 将子类保存为父类(super class)类型并在 Java 中使用其方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22362230/

相关文章:

java - 如何使用Java删除字符串中的重复空格?

java - 使用 java.util.logging 的好例子

.net - 从子应用程序卸载 web.config 文件的一部分

安卓主题继承

python - 实现自定义 pretty-print 的最佳方法

python - 在子类中强制使用类变量

Java从父类(super class)调用方法并更改返回语句

java - 使用 Apache POI 删除特定 Excel 工作表上的所有边框

java - 正则表达式匹配单个字符

c++ - 存储派生对象的映射