Java 如何知道程序何时处于编译时阶段和运行时阶段?
我当时正在研究多态性,有一个问题是不知道程序何时处于编译时阶段或运行时阶段 我知道编译器在编译时查看代码,它将代码转换为字节码,在运行时执行,但在编译时通过对子类对象的超类引用初始化对象时,编译器只知道它是对超类的引用,例如:Java 如何知道程序何时处于编译时阶段和运行时阶段?,java,time,compilation,runtime,Java,Time,Compilation,Runtime,我当时正在研究多态性,有一个问题是不知道程序何时处于编译时阶段或运行时阶段 我知道编译器在编译时查看代码,它将代码转换为字节码,在运行时执行,但在编译时通过对子类对象的超类引用初始化对象时,编译器只知道它是对超类的引用,例如: public class SuperClass extends Object { public void method1() System.out.printlin("executed from the superClass"); } publi
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.method1时,sup是一个超类引用;被叫
在编译时,它查看超类并执行原始method1
但在运行时,编译器知道sup是SubClass类型的对象,所以
它在supclass中查找method1并执行method1的重写版本,但我的问题是我无法理解sup.method1在哪个阶段;在运行时或编译时执行
我知道,如果您在编译时,您可以执行强制转换,使编译器从supclass执行method1,但是如果sup.method1在
运行时,那么施放角色有什么意义呢
注意:请原谅我拙劣的术语,我对整个继承/多态性概念还是新手。编译器在编译期间不执行代码;该方法在运行时执行。
sup对象的实际类型将始终是子类,但它可以被称为其超类型,如您的示例中所示 无法强制转换sup对象以使其从超类调用method1。强制转换仅更改用于引用对象的类型,而不是对象本身的实际类型。
若子类有另一个方法method2,则可以使用强制转换,而该方法在超类中不存在。如果您随后通过超类引用引用了子类实例,那么如果不先转换(向下转换)子类引用,您将无法调用method2。多态性不是您在此解释的,请注意。仔细阅读这篇文章-