Java语言的HelloWorld程序详细分析.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java语言的Hello World程序详细分析 HelloWorld.java public class HelloWorld { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Hello World); } } 这是每个Java程序员都知道的。虽然简单,但是从一个简单的问题可以引入更深的思考。在这篇文章中,我们将讨论这个简单的程序。 HelloWorld.java public class HelloWorld { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Hello World); } } ?1、为什么一切都开始于一个类? Java程序是由类组成,一个类包含方法和属性。这是由于它的面向对象的特征:一切皆对象,每个对象都是一个类的实例。面向对象编程有很多优势,比如更好的模块化,扩展性强等 2、为什么总有一个“main”方法? “main”方法是程序的入口,它是静态的。 “static”是指该方法是类的一部分,而不是对象的一部分。 这是为什么?我们为什么不把一个非静态方法作为程序的入口? 如果方法不是静态的,那么需要创建一个对象后才能使用方法。因为必须用对象去调用方法。对于程序的入口,这是不现实的。所以,程序的入口方法是静态的。 参数“String[] args”表示一个字符串数组可以被传入到该程序,用来初始化程序。 3、HelloWorld的字节码 执行这个程序,Java文件首先编译为java字节码储存在.class文件里。 字节码是什么样子的呢? 首先,字节码本身是无法读取。如果我们用一个十六进制编辑器打开,它看起来像下面这样: 我们能看到很多操作码(比如 ?CA、4C 等)在字节码上,它们每个都有一个相应的助记码(比如,aload_0 在下面的例子中)。操作码是不可读的,但我们可以用javap命令查看.class文件的助记符形式。 “javap -C”打印出每个方法的反汇编代码。反汇编代码的意思是包括Java字节码的说明。 javap -classpath . -c HelloWorld ? Compiled from HelloWorld.java public class HelloWorld extends java.lang.Object{ public HelloWorld(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object.init:()V 4: return public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //String Hello World 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return } ?上面的代码中包含两个方法:一个是默认构造函数,这是由编译器推断出,另一个是main方法。 每个方法下面,都有一系列指令,比如 aload_0,invokespecial #1,等 下面的每个方法,也有说明,如aload_0,invokespecial#1,等指令可以在java指令清单里查到。例如,aload_0指令是加载一个从栈中引用的本地变量0,getstatic 指令获取一个类的静态字段值。注意“#2” 指令在getstatic指令后指向运行常量池。常量池是一个JVM运行时数据区,查看 。我们可以用“javap -verbose”命令来查看常量池。 此外,每个指令开始于一个数字,如0,1,4等。在.class文件中,每个方法都有一个对应的字节码数组。这些数字对应的每一个操作码和它的参数都存储在数组中的索引中。每个操作码为1个字节,指令可以有0个或多个参数。这就是为什么数字是不连续的。 现在,我们可以用“javap -verbose” 查看.class文件进一步研究。 javap -classpath . -verbose

文档评论(0)

ktj823 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档