经过2-3个小时才知道,编译时和运行时之间有什么区别。最后,我想出了这个。
在运行时分配的内存称为运行时/动态绑定,在编译时分配,称为编译时/静态绑定。
然后我尝试了这个例子
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
的对象,但突然编译器发现,类错误匹配。因此,它将动态绑定thisclass
对象的空间。
所以,直到这里,我得到了东西。但是,我发现,另一个常见的答案是 重载参考编译时间和覆盖参考运行时 。我没有明白这一点。
thisclass a= new thisclass();
a.here();
这也称为运行时绑定。 ??如果在这里写错了,请纠正我。
答案 0 :(得分:4)
首先,内存分配不在此图中。没有编译时内存分配。
这个问题将编译时与静态绑定和运行时与动态绑定混为一谈。
静态绑定发生在编译时;动态绑定发生在运行时。
现在,当你写
myclass m= new thisclass();
m.here(18);
在编译时发生的是签名方法的解析:你正在调用here(int)
并且该选择是最终的。这被称为“静态绑定”。在运行时发生的是方法 dispatch :运行时选择适合here(int)
引用的对象的运行时类型的m
实现。有两种方法可供选择:myclass.m(int)
和thisclass.m(int)
,运行时在此特定示例中选择后者。这被称为“动态绑定”。
至于你的问题“是动态绑定的必要条件”...... Java语言规范规定了选择在运行时调用的正确方法的规则。这些规则意味着对一般情况称为“动态绑定”的过程。但是如果你问的是在运行时是否总是发生任何特定的进程,那么故事就不同了:优化的JIT编译器可以看到只有一种方法可供选择并输出一个“单态调用站点”,它对单个选项进行硬编码。此外,它还可以将整个方法内联到调用者中,从而甚至删除调用本身。
答案 1 :(得分:0)
这:
thisclass a= new thisclass();
a.here();
不是运行时绑定,因为编译器知道要调用的here()方法(来自thisclass的方法)。但如果你愿意:
myclass a= new thisclass();
a.here();
然后是运行时绑定。
P.S。:您的班级名称应以大写字母开头。
答案 2 :(得分:0)
但是,我发现,另一个常见的答案是重载参考 编译时和覆盖引用运行时。我没有得到这个 点。
重载意味着在同一个类中具有多个具有不同参数的方法。调用哪个方法在编译时是已知的,因为此时指定了参数。
重写意味着从子类中的父类重新定义方法。