运行时绑定
发生在运行时,因为编译器不能在编译时
决定执行哪个函数,但为什么编译器不能在编译时决定呢?
class Animal{
void eat(){
System.out.println("animal is eating...");
}
}
class Dog extends Animal{
void eat(){
System.out.println("dog is eating...");
}
}
class Cat extends Animal{
void eat(){
System.out.println("cat is
eating...");
}
}
public static void main(String args[]){
Animal a=new Dog();
a.eat();
Animal b=new Cat();
b.eat();
}
}
产出:
狗在吃...
运行时绑定发生在运行时,因为编译器不能决定在编译时执行哪个函数。
这是不正确的,至少在Java的情况下是这样。
Java中的运行时绑定不是Java编译器缺陷的结果。这是设计好的。
这意味着您的应用程序可以使用第三方提供的插件。
的确,应用程序可以加载不同版本的东西,处理平台差异等等。
好的一点是,Java在维护运行时类型安全的同时做到了这一点。
…但是为什么编译器不能在编译时决定呢?
嗯,他们可以设计Java,这样编译器(或链接器)就可以在运行时绑定所有东西。但如果他们这样做了,Java将是一种非常不同的语言。
1-也就是说...“写一次,到处跑”是现实而不是营销炒作。
问题内容: 考虑以下示例代码 它给出以下输出 方法调用将在运行时解决,并按预期调用正确的重写方法。 后来我了解到,变量访问是在编译时解决的。我期望输出为 因为在派生类中阴影的重新定义是在基类中的。 为什么变量的绑定在编译时而不是在运行时发生?这是仅出于性能原因吗? 问题答案: 原因在Java语言规范的15.11节中的示例中进行了说明,如下所示: … 最后一行表明,实际上,所访问的字段不依赖于所引用
例如如下代码: SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); Date date = sdf.parse("abcd"); 这段代码会抛出ParseException,而它是编译时异常,为什么编译阶段不报错,运行时报错?
我在一个类中有一个方法,该方法具有使用泛型指定的返回类型。 对于通用返回类型,我假设上面示例中的返回将评估为: 相反,被正确返回和打印。 如果我将调用更改为: 我错过了什么,以帮助我理解这里发生了什么,为什么原始版本没有导致编译错误。
问题内容: 因此,如果我有一个,由于某种原因,如果我在另一段代码(如)中引用它,则在编译过程中它不会内联到代码中。因此,它不是在被编译之后而是。 问题答案: 您不是编译时间常数,因为JLS 表示 不是。只能在常量表达式中使用的类型是基本类型和。 它的意义是,一个实例(通常)具有语义上重要的对象标识,该标识将其与其他实例区分开。此对象标识不能编码在类文件中……至少,不能用当前的类文件格式编码。(如果
问题内容: 我在类中有一个方法,该方法具有通过使用泛型指定的返回类型。 对于通用返回类型,我假设以上示例中的返回将计算为: 而是返回a并正确打印。 如果将调用更改为:我收到编译错误: 我缺少什么来帮助我了解这里发生了什么以及为什么原始版本没有导致编译错误。 问题答案: 这是因为重载解析解决了您的调用,因为没有。 请记住,Java的泛型会在运行时删除。像这样的演员阵容将被删除,并移至呼叫站点。有时这
问题内容: 何时加载静态变量,运行时或编译时?有人可以解释一下吗? 我非常感谢您的帮助。 谢谢。 问题答案: 它们在运行时加载。 静态表示:该变量属于该类,而不属于该类的实例。因此,每个静态变量只有一个值,如果您有该类的n个实例,则没有n个值。