现在的位置: 首页 > 综合 > 正文

我们能从java的HelloWorld学到什么?

2014年06月10日 ⁄ 综合 ⁄ 共 2273字 ⁄ 字号 评论关闭

我们能从java的HelloWorld学到什么?

申请达人,去除赞助商链接

这是每个Java程序员都知道的。虽然简单,但是从一个简单的问题可以引入更深的思考。在这篇文章中,我们将讨论这个简单的程序。如果能更多的帮到你,请留下宝贵的意见。

HelloWorld.java

  1. public class HelloWorld {
  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. // TODO Auto-generated method stub
  7. System.out.println("Hello World");
  8. }
  9. }

 1、为什么一切都开始于一个类?

Java程序是由类组成,一个类包含方法和属性。这是由于它的面向对象的特征:一切皆对象,每个对象都是一个类的实例。面向对象编程有很多优势,比如更好的模块化,扩展性强等

2、为什么总有一个“main”方法?

“main”方法是程序的入口,它是静态的。 “static”是指该方法是类的一部分,而不是对象的一部分。

这是为什么?我们为什么不把一个非静态方法作为程序的入口?

如果方法不是静态的,那么需要创建一个对象后才能使用方法。因为必须用对象去调用方法。对于程序的入口,这是不现实的。所以,程序的入口方法是静态的。

参数“String[] args”表示一个字符串数组可以被传入到该程序,用来初始化程序。

3、HelloWorld的字节码

执行这个程序,Java文件首先编译为java字节码储存在.class文件里。

字节码是什么样子的呢?

首先,字节码本身是无法读取。如果我们用一个十六进制编辑器打开,它看起来像下面这样:

我们能看到很多操作码(比如  CA、4C 等)在字节码上,它们每个都有一个相应的助记码(比如,aload_0 在下面的例子中)。操作码是不可读的,但我们可以用javap命令查看.class文件的助记符形式。

“javap -C”打印出每个方法的反汇编代码。反汇编代码的意思是包括Java字节码的说明。

  1. javap -classpath . -c HelloWorld

 

  1. Compiled from "HelloWorld.java"
  2. public class HelloWorld extends java.lang.Object{
  3. public HelloWorld();
  4. Code:
  5. 0: aload_0
  6. 1: invokespecial #1; //Method java/lang/Object."<init>":()V
  7. 4: return
  8. public static void main(java.lang.String[]);
  9. Code:
  10. 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
  11. 3: ldc #3; //String Hello World
  12. 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  13. 8: return
  14. }

 上面的代码中包含两个方法:一个是默认构造函数,这是由编译器推断出,另一个是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文件进一步研究。

  1. javap -classpath . -verbose HelloWorld

 

  1. Compiled from "HelloWorld.java"
  2. public class HelloWorld extends java.lang.Object
  3. SourceFile: "HelloWorld.java"
  4. minor version: 0
  5. major version: 50
  6. Constant pool:
  7. const #1 = Method #6.#15; // java/lang/Object."<init>":()V
  8. const #2 = Field #16.#17; // java/lang/System.out:Ljava/io/PrintStream;
  9. const #3 = String #18; // Hello World
  10. const #4 = Method #19.#20; // java/io/PrintStream.println:(Ljava/lang/String;)V
  11. const #5 = class #21; // HelloWorld
  12. const #6 = class #22; // java/lang/Object
  13. const #7 = Asciz <init>;
  14. const #8 = Asciz ()V;
  15. const #9 = Asciz Code;
  16. const #10 = Asciz LineNumberTable;
  17. const #11 = Asciz main;

抱歉!评论已关闭.