[英]compile time vs run time
经过2-3个小时的了解后, compile-time和run-time有什么区别。 最后,我想到了这个。
在运行时分配的内存称为运行时/动态绑定,在编译时分配的内存称为编译时/静态绑定。
然后我尝试了这个例子
class myclass {
void here() {
System.out.println("Here from myclass !!");
}
void here(int i) {
System.out.println("Here !!" + i);
}
}
class thisclass extends myclass {
void here() {
System.out.println("Here from thisclass !!");
}
}
public class poly {
public static void main(String s[]) {
myclass m= new myclass();
myclass a= new thisclass();
m.here();
m.here(12);
a.here();
a.here(13);
}
}
因此,我还发现myclass a= new thisclass();
被认为是运行时绑定。 既然, a
是myclass
的对象,但是突然编译器发现,class不匹配。 因此,它将动态绑定thisclass
对象的空间。
所以,直到这里,我明白了。 但是,我发现,另一个常见的答案是重载是指编译时,而重载是指运行时 。 我没有明白这一点。
thisclass a= new thisclass();
a.here();
这也称为运行时绑定。 ?? 如果在这里写错了什么,请纠正我。
首先,该图中没有内存分配。 没有编译时内存分配。
这个问题使静态绑定的编译时间和动态绑定的运行时间混为一谈。
静态绑定发生在编译时; 动态绑定在运行时发生 。
现在,当你写
myclass m= new thisclass();
m.here(18);
编译时发生的是方法签名的解析:您正在调用here(int)
,而选择是最终的。 这被称为“静态绑定”。 在运行时发生的是方法分派 :运行时选择适合于m
引用的对象的运行时类型的here(int)
实现。 有两种方法可供选择: myclass.m(int)
和thisclass.m(int)
,运行时在此特定示例中选择后者。 这被称为“动态绑定”。
关于您的问题“对动态绑定是强制性的”……Java语言规范规定了选择正确的方法以在运行时调用的规则。 这些规则意味着一般情况下称为“动态绑定”的过程。 但是,如果您问是否在运行时总是发生任何特定的过程,则情况就不同了:优化的JIT编译器可以看到只有一种方法可供选择,并输出一个“单态调用站点”,该站点对单项选择进行硬编码。 此外,它还可以将整个方法内联到调用方中,从而甚至删除调用本身。
这个:
thisclass a= new thisclass();
a.here();
不是运行时绑定,因为编译器知道要调用的here()方法(该类中的一个)。 但是,如果您会说:
myclass a= new thisclass();
a.here();
那么将是运行时绑定。
PS:您的班级名称应以大写字母开头。
但是,我发现,另一个常见的答案是重载指的是编译时,而重载指的是运行时。 我没有明白这一点。
重载是指在同一类中具有多个带有不同参数的方法。 在编译时就知道调用哪种方法,因为此时已指定了参数。
重写意味着从子类中的父类重新定义方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.