编译时间与运行时间

时间:2012-11-05 13:08:39

标签: java runtime polymorphism compile-time

经过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();被认为是运行时绑定。因为amyclass的对象,但突然编译器发现,类错误匹配。因此,它将动态绑定thisclass对象的空间。

所以,直到这里,我得到了东西。但是,我发现,另一个常见的答案是 重载参考编译时间和覆盖参考运行时 。我没有明白这一点。

thisclass a= new thisclass();
a.here();

这也称为运行时绑定。 ??如果在这里写错了,请纠正我。

3 个答案:

答案 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)

  

但是,我发现,另一个常见的答案是重载参考   编译时和覆盖引用运行时。我没有得到这个   点。

重载意味着在同一个类中具有多个具有不同参数的方法。调用哪个方法在编译时是已知的,因为此时指定了参数。

重写意味着从子类中的父类重新定义方法。