编译器在把.java文件变成.class文件的过程中都干了些啥?

woodfans 2004-12-27 03:55:55
刚看到《thinking in java》里的第四章 构造和初始化 里写道这样一句话:由于构造函数是由编译器调用的,因此编译器必须要知道能调用哪个方法。该做何理解,大人指教!
...全文
264 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
woodfans 2004-12-27
  • 打赏
  • 举报
回复
晕,我错了还不行吗...........
night__cat 2004-12-27
  • 打赏
  • 举报
回复
猪啊.这也要问吗?.class文件是字节码,java虚拟机就是执行这个的.他不是象exe那样的可执行文件,没有虚拟机就执行不了.
woodfans 2004-12-27
  • 打赏
  • 举报
回复
没人啦,俺也歇着去
woodfans 2004-12-27
  • 打赏
  • 举报
回复
to jFresH_MaN():
那这句话“由于构造函数是由编译器调用的,因此编译器必须要知道能调用哪个方法.

怎么解释啊?javac调用构造函数?分配内存?
woodfans 2004-12-27
  • 打赏
  • 举报
回复
to jFresH_MaN():
嘿嘿,那你得去问问那个神奇的编译器都干了些什么喽!
jFresH_MaN 2004-12-27
  • 打赏
  • 举报
回复
javac就是编译器
我个人觉得编译过程和jvm无关。
只有解释和执行class文件的时候才和jvm挂上钩
jFresH_MaN 2004-12-27
  • 打赏
  • 举报
回复
我也来学习一下,呵呵
大家讨论地不错,看有没有什么新的想法
我主要是想知道编译java文件到class文件的过程细节
如果只是说编译成二进制文件,那这谁都知道,不知道有没有大侠对这个所谓的二进制文件有什么想法。
woodfans 2004-12-27
  • 打赏
  • 举报
回复
to EverythingMaster:你说的意思我明白。
顺便问个问题,这里的编译器指的是啥?我觉得有点抽象啊,不大明白
fuwang 2004-12-27
  • 打赏
  • 举报
回复
建议楼主先看浅显的书,如java核心技术I
fuwang 2004-12-27
  • 打赏
  • 举报
回复
楼上的错了,应该是
javac -verbose XXX.java

由于构造函数是由编译器调用的,因此编译器必须要知道能调用哪个方法.
这是因为有多个构造函数,产生了重载,编译器根据构造函数的参数的类型和个数决定调用哪一个。
EverythingMaster 2004-12-27
  • 打赏
  • 举报
回复
你说的thinking in java中的问题,意思是说,需要采用一种机制来告诉编译器在为对象分配内存时能够自动执行一些必要的初始化操作。那么java采取的方法与c++是一样的,就是与类名同名的方法为构造方法,编译器会自动调用这个方法执行初始化,如果没有显式声明,那就执行默认方法。
射天狼 2004-12-27
  • 打赏
  • 举报
回复
还真不知道:(
woodfans 2004-12-27
  • 打赏
  • 举报
回复
对了,由于构造函数是由编译器调用的,因此编译器必须要知道能调用哪个方法。这句话里的编译器我觉得应该是指jvm才对,这样应该就没有什么问题了
woodfans 2004-12-27
  • 打赏
  • 举报
回复
应该是javac -verbose XXX

[parsing started Test.java]
[parsing completed 156ms]
[loading C:\j2sdk1.4.1_05\jre\lib\rt.jar(java/lang/Object.class)]
[loading C:\j2sdk1.4.1_05\jre\lib\rt.jar(java/lang/String.class)]
[checking Test]
[loading C:\j2sdk1.4.1_05\jre\lib\rt.jar(java/lang/System.class)]
[loading C:\j2sdk1.4.1_05\jre\lib\rt.jar(java/io/PrintStream.class)]
[loading C:\j2sdk1.4.1_05\jre\lib\rt.jar(java/io/FilterOutputStream.class)]
[loading C:\j2sdk1.4.1_05\jre\lib\rt.jar(java/io/OutputStream.class)]
[wrote Test.class]
[total 609ms]
EverythingMaster 2004-12-27
  • 打赏
  • 举报
回复
把程序代码编译成字节码,这个字节码(.class文件)在任何有jvm的平台上都能运行。
这也是java的聪明之处,借此它说一处编译,多处运行。至于java XXX.class的时候,jvm会把字节码转换成相应平台的机器代码来运行。
woodfans 2004-12-27
  • 打赏
  • 举报
回复
to tomuno:那是jvm干的事情吧,class文件还不是机器语言吧
kaymo 2004-12-27
  • 打赏
  • 举报
回复
java -verbose : class XXX//XXX为你的java文件

可以看看过程
woodfans 2004-12-27
  • 打赏
  • 举报
回复
我也有那本书,买了还没看,惭愧.......
javap我也用过,不过好像跟这个没啥关系吧
tomuno 2004-12-27
  • 打赏
  • 举报
回复
把高级语言翻译未机器语言
jFresH_MaN 2004-12-27
  • 打赏
  • 举报
回复
说实话,学了那么久java,还真不知道楼主标题上的问题。
我现在手头上有《深入java虚拟机》,但还没看,我想以后看了会有点眉目吧!
如果楼主想了解这类的支持看看javap命令和我说的书吧

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧