将子类保存为超类类型并在Java中使用其方法

时间:2014-03-12 19:44:48

标签: java inheritance subclass superclass

在下面的代码中,子类扩展其超类,并覆盖其方法,使用它来调用另一个子类唯一的方法,该方法使用子类的变量。

然后,程序将子类的实例存储到Superclass类型的变量中,然后调用其方法。然后它运行就像它是Subclass类型一样,调用子类的唯一方法和变量。但是,直接访问它们是不可能的。

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
    }
}

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

1 个答案:

答案 0 :(得分:0)

在变量和静态方法的情况下,根据引用的类型调用方法,而不是根据被引用的对象。

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