Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道程序何时处于编译时阶段和运行时阶段?_Java_Time_Compilation_Runtime - Fatal编程技术网

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。

多态性不是您在此解释的,请注意。仔细阅读这篇文章-