2014-02-10 58 views
5

我读过继承是一种“编译时间”现象,在另一个地方,我读过超类代码是由类加载器加载的,我推测这是在运行时发生的。我对继承的性质有些困惑,子类的类文件是否包含超类的实际编译代码,还是在运行时访问?Java中的子类编译

+0

“我已阅读。 ..“:你能提供一个参考吗? –

+0

http://www.cs.utexas.edu/users/lavender/courses/tutorial/java-06.pdf –

+0

我可以看到为什么会增加你的困惑。正如其他答案指出的那样,继承在编译时和运行时都很重要。那句话是错的。 –

回答

4

因此,考虑您创建一个类,该类继承了包含在第三方jar文件

为了编译你的代码,你需要在编译器的类路径中有第三方jar文件。

为了运行您的代码,您还需要启动应用程序的java命令的类路径中的jar文件。

你的子类不包含超类的代码,它在jar文件中。您编译的类包含对超类的引用。当你的类被类加载器加载时,它会在超类的类路径中搜索并加载它。

+2

我认为你的回答可能会更好地解决他的困惑,但我认为他正在徘徊于一个既不是或者命题的想法,也不是。它是两个。它在编译时需要被编译,并且在运行时需要被加载和链接。 – lscoughlin

+0

@lscoughlin同意。我不认为像编译时或运行时这样的语言概念。 – mikea

+0

感谢你和@Iscoughlin,这清除了我的怀疑... @ Iscoughlin是正确的,我想知道它的一个或者是一个命题,你的评论是否能够清除空气。 –

1

你在哪里阅读过它的编译时间?我猜如果你编译你的子类,那么是的,它需要有一个超类来编译时参考。

但是当你真正运行是动态链接按代码:

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

“Java虚拟机动态加载,链接和初始化类和接口”

+0

http://www.cs.utexas.edu/users/lavender/courses/tutorial/java-06.pdf我在第一行的PDF文件中阅读它。这增加了我的困惑。 –