如何知道程序何时处于编译阶段和运行阶段?

时间:2019-04-20 22:31:09

标签: java time compilation runtime

我当时正在研究多态性,并且有一个不知道程序何时处于编译阶段或运行阶段的问题。

我知道编译器会在编译时查看代码,然后将其转换为字节码以在运行时执行,但是在编译时通过对子类对象的超类引用初始化对象时,编译器仅知道其引用以超类为例:

public class SuperClass extends Object {
    public void method1()
        System.out.printlin("executed from the superClass");
}

public class SubClass extends superClass {
    public void method1()
        System.out.printlin("executed from the subClass");
}
...

在主类中:

SuperClass sup = new subClass();
sup.method1;
...

现在我的问题是,如果编译器(在编译时)只知道 那sup是sup.method1时的SuperClass引用;被叫 在编译时,它会在SuperClass中查找并执行原始方法1 但是在运行时,编译器知道sup是SubClass类型的对象,因此 它在supclass内查找method1并执行method1的重写版本,但是我的问题是我无法理解sup.method1在哪个阶段;是在运行时还是在编译时执行?

我知道,如果您在编译时,可以进行强制转换以使编译器从supclass执行method1,但是如果sup.method1在以下位置执行 运行时间,那么投放的意义何在?

注意:不好意思,我对整个继承/多态性概念还是陌生的。

1 个答案:

答案 0 :(得分:0)

编译器在编译过程中不执行代码;该方法在运行时执行。
sup对象的实际类型将始终是SubClass,但在您的示例中,它可以称为其超类型。

无法转换sup对象以使其从SuperClass调用method1。强制转换仅更改用于引用对象的类型,而不更改对象本身的实际类型。
如果SubClass具有另一种方法method2,而SuperClass中不存在该方法,则可以进行强制转换。如果您随后通过SuperClass引用获得了对SubClass实例的引用,则在不首先将引用强制转换(向下转换)到SubClass的情况下将无法调用method2。