2012-11-05 92 views
0

经过2-3个小时才知道,编译时和运行时间之间有什么区别。最后,我想出了这个。编译时间vs运行时间

在运行时分配的内存涉及运行时/动态绑定,并在编译时分配,涉及编译时/静态绑定。

,然后我试过了这个例子

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(); 

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

+1

是C++代码吗? – Mob

+0

随意添加[tag:C#]或[tag:Java]。这不是C++。 –

+0

对不起。这是java代码 – Ravi

回答

4

首先,内存分配不在这张图里。没有编译时内存分配。

这个问题将编译时与静态绑定和运行时与动态绑定混为一谈。

静态绑定发生在编译时间;动态绑定发生在运行时。

现在,当你写

myclass m= new thisclass(); 
m.here(18); 

在编译时会发生什么是方法签名的分辨率:您呼叫here(int)和选择是最终的。这被称为“静态绑定”。运行时会发生什么情况是:方法调度:运行时将选择适合于m引用的对象的运行时类型的here(int)实现。有两种方法可供选择:myclass.m(int)thisclass.m(int),并且运行时在此特定示例中选择后者。这被称为“动态绑定”。

至于你的问题是“动态绑定强制重写”...Java语言规范规定了选择在运行时调用的正确方法的规则。这些规则意味着一般情况下称为“动态绑定”的过程。但是,如果您询问运行时是否总是发生任何特定进程,故事情况就不同了:优化的JIT编译器可以看到只有一种方法可供选择,并输出一个硬编码单一选项的“单形态调用站点”。此外,它还可以将内联整个方法放入调用方,从而消除即使是调用本身。

+0

ok ,,所以我的问题是..这是一个有效的观点,说'重载是指编译时间和重写引用运行时'宁比'重载是指编译时间和覆盖所需的运行时间'我的意思是,重写动态绑定强制? – Ravi

+0

这是我的答案所暗示的。使用的确切方法重载的解析(它由其**签名**定义)在编译时发生。精确方法的解析覆盖调用发生在运行时。 –

+0

我不明白你的意思是“强制动态绑定”。有或没有方法覆盖,动态绑定在那里。 –

0

此:

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

不运行时绑定,编译器知道这里是什么()方法调用(一个来自thisclass)。但如果你会说:

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

然后将是一个运行时绑定。

P.S .:你的类名应该以大写字母开头。

+0

如果你通过我的问题,那么这是我的问题..但是,如何?因为,我还提到'重载是指编译时间和重写引用运行时'。这点呢? – Ravi

+0

在Java语言规范(http://docs.oracle.com/javase/)中提供了方法调用的全面详细说明,包括编译时完成的内容和运行时完成的内容。 specs/jls/se7/html/jls-15.html#jls-15.12) –

0

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

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

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

+0

我知道这..但我的问题是..为什么我们说'超载是指编译时间和重写提到运行时'。因为'myclass m = new thisclass();'是我们说动态绑定的地方。这是否真的需要重写?我们不能做到这一点,当我们没有执行重写概念时? – Ravi

+0

这就是所谓的运行时绑定,因为例如,在你的代码的后面,你可以用'myclass'的任何子类动态地改变'm'的类型。像这样:'m = new AnotherSubClass()'。 –