Java语言的Hello World程序详细分析.doc_第1页
Java语言的Hello World程序详细分析.doc_第2页
Java语言的Hello World程序详细分析.doc_第3页
Java语言的Hello World程序详细分析.doc_第4页
Java语言的Hello World程序详细分析.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java语言的Hello World程序详细分析HelloWorld.javapublic class HelloWorld /* * param args */public static void main(String args) / TODO Auto-generated method stubSystem.out.println(Hello World);这是每个Java程序员都知道的。虽然简单,但是从一个简单的问题可以引入更深的思考。在这篇文章中,我们将讨论这个简单的程序。HelloWorld.javapublic class HelloWorld /* * param args */public static void main(String args) / TODO Auto-generated method stubSystem.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 HelloWorldCompiled from HelloWorld.javapublic class HelloWorld extends java.lang.Objectpublic HelloWorld(); Code: 0:aload_0 1:invokespecial#1; /Method java/lang/Object.:()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,invokespecial1,等指令可以在java指令清单里查到。例如,aload_0指令是加载一个从栈中引用的本地变量0,getstatic 指令获取一个类的静态字段值。注意“2” 指令在getstatic指令后指向运行常量池。常量池是一个JVM运行时数据区,查看 。我们可以用“javap -verbose”命令来查看常量池。此外,每个指令开始于一个数字,如0,1,4等。在.class文件中,每个方法都有一个对应的字节码数组。这些数字对应的每一个操作码和它的参数都存储在数组中的索引中。每个操作码为1个字节,指令可以有0个或多个参数。这就是为什么数字是不连续的。现在,我们可以用“javap -verbose” 查看.class文件进一步研究。javap -classpath . -verbose HelloWorldCompiled from HelloWorld.javapublic class HelloWorld extends java.lang.Object SourceFile: HelloWorld.java minor version: 0 major version: 50 Constant pool:const #1 = Method#6.#15;/ java/lang/Object.:()Vconst #2 = Field#16.#17;/ java/lang/System.out:Ljava/io/PrintStream;const #3 = String#18;/ Hello Worldconst #4 = Method#19.#20;/ java/io/PrintStream.println:(Ljava/lang/String;)Vconst #5 = class#21;/ HelloWorldconst #6 = class#22;/ java/lang/Objectconst #7 = Asciz;const #8 = Asciz()V;const #9 = AscizCode;const #10 = AscizLineNumberTable;const #11 = Ascizmain;const #12 = Asciz(Ljava/lang/String;)V;const #13 = AscizSourceFile;const #14 = AscizHelloWorld.java;const #15 = NameAndType#7:#8;/ :()Vconst #16 = class#23;/ java/lang/Systemconst #17 = NameAndType#24:#25;/ out:Ljava/io/PrintStream;const #18 = AscizHello World;const #19 = class#26;/ java/io/PrintStreamconst #20 = NameAndType#27:#28;/ println:(Ljava/lang/String;)Vconst #21 = AscizHelloWorld;const #22 = Ascizjava/lang/Object;const #23 = Ascizjava/lang/System;const #24 = Ascizout;const #25 = AscizLjava/io/PrintStream;const #26 = Ascizjava/io/PrintStream;const #27 = Ascizprintln;const #28 = Asciz(Ljava/lang/String;)V; public HelloWorld(); Code: Stack=1, Locals=1, Args_size=1 0:aload_0 1:invokespecial#1; /Method java/lang/Object.:()V 4:return LineNumberTable: line 2: 0 public static void main(java.lang.String); Code: Stack=2, Locals=1, Args_size=1 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 LineNumberTable: line 9: 0 line 10: 8JVM定义:运行常量池提供一个类似于传统的编程语言的符号表函数,尽管它包含了比典型的符号表范围更广的数据“invokespecial #1指令指向#1常量在常量池中.常量是”Method #6.#15;“从数字上看,我们就可以按递归方式来得到最终的常量。LineNumberTable提供用来调试java源代码对应字节码的行数信息例如,在main方法里Java源代码第9行对应字节码0,第10行对应字节码8。如果你想知道更多关于字节码,您可以创建和编译一个更复杂的类来看一看。HelloWorld确实是个很简单的例子。4、它是如何在JVM中执行?现在的问题是如何JVM加载类并调用main方法?在main方法执行之前,JVM需要分三步走加载、连接以及初始化该类。1)加载二进制的类和接口到jvm中。 2)连接合并二进制数据到正在运行状态的jvm。连接有三步构成,验证、准备、解析。验证确保了类/接口在结构上正确的;准备工作包括所需要的类/接口分 配内存;解析符号引用。最后3)初始化变量并初始化值这个装载工作是由Java类加载器完成的。当JVM启动时,3个类加载器被使用:1.引导类加载器:加载位于/ jre / lib目录的核心Java库。这是jvm核心的一部分,并且是原生的代码。2.扩展类加载器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论