想必大家对这一段JAVA代码一定不会陌生:

public class Test {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

输出:Hello World!

今天咱们就从头开始分析一下它是如何从编译到输出的。

1、编译

javac Test.java,生成JAVA的字节码文件:Test.class。使用hexdump -C Test.class查看如下:

00000000  ca fe ba be 00 00 00 32  00 1d 0a 00 06 00 0f 09  |.......2........|
00000010 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 |................|
00000020 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |.....<init>...()|
00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN|
00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai|
00000050 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 |n...([Ljava/lang|
00000060 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 |/String;)V...Sou|
00000070 72 63 65 46 69 6c 65 01 00 09 54 65 73 74 2e 6a |rceFile...Test.j|
00000080 61 76 61 0c 00 07 00 08 07 00 17 0c 00 18 00 19 |ava.............|
00000090 01 00 0c 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 07 |...Hello World!.|
000000a0 00 1a 0c 00 1b 00 1c 01 00 04 54 65 73 74 01 00 |..........Test..|
000000b0 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 |.java/lang/Objec|
000000c0 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 |t...java/lang/Sy|
000000d0 73 74 65 6d 01 00 03 6f 75 74 01 00 15 4c 6a 61 |stem...out...Lja|
000000e0 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 |va/io/PrintStrea|
000000f0 6d 3b 01 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 |m;...java/io/Pri|
00000100 6e 74 53 74 72 65 61 6d 01 00 07 70 72 69 6e 74 |ntStream...print|
00000110 6c 6e 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 |ln...(Ljava/lang|
00000120 2f 53 74 72 69 6e 67 3b 29 56 00 21 00 05 00 06 |/String;)V.!....|
00000130 00 00 00 00 00 02 00 01 00 07 00 08 00 01 00 09 |................|
00000140 00 00 00 1d 00 01 00 01 00 00 00 05 2a b7 00 01 |............*...|
00000150 b1 00 00 00 01 00 0a 00 00 00 06 00 01 00 00 00 |................|
00000160 01 00 09 00 0b 00 0c 00 01 00 09 00 00 00 25 00 |..............%.|
00000170 02 00 01 00 00 00 09 b2 00 02 12 03 b6 00 04 b1 |................|
00000180 00 00 00 01 00 0a 00 00 00 0a 00 02 00 00 00 03 |................|
00000190 00 08 00 04 00 01 00 0d 00 00 00 02 00 0e |..............|
0000019e

这是二进制文件,看不明没有关系,java提供了javap可以查看内容是什么。

2、查看CLASS文件

javap -verbose Test。其他关于javap的内容,可以查看:http://www.cnblogs.com/liqiu/p/hexdump.html

Compiled from "Test.java"
public class Test extends java.lang.Object
SourceFile: "Test.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#15; // java/lang/Object."<init>":()V
const #2 = Field #16.#17; // java/lang/System.out:Ljava/io/PrintStream;
const #3 = String #18; // Hello World!
const #4 = Method #19.#20; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class #21; // Test
const #6 = class #22; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V;
const #13 = Asciz SourceFile;
const #14 = Asciz Test.java;
const #15 = NameAndType #7:#8;// "<init>":()V
const #16 = class #23; // java/lang/System
const #17 = NameAndType #24:#25;// out:Ljava/io/PrintStream;
const #18 = Asciz Hello World!;
const #19 = class #26; // java/io/PrintStream
const #20 = NameAndType #27:#28;// println:(Ljava/lang/String;)V
const #21 = Asciz Test;
const #22 = Asciz java/lang/Object;
const #23 = Asciz java/lang/System;
const #24 = Asciz out;
const #25 = Asciz Ljava/io/PrintStream;;
const #26 = Asciz java/io/PrintStream;
const #27 = Asciz println;
const #28 = Asciz (Ljava/lang/String;)V; {
public Test();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 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 3: 0
line 4: 8 }

别看写的挺多的,分析一下么有什么:

  1. 首先说明一下版本和文件名之类的,至于class文件的格式,可以参考:http://blog.csdn.net/tyrone1979/article/details/964560
  2. 然后const的部分是将内容放入内存
  3. public Test()是默认的构造函数
  4. 有用的就是:public static void main() .............................

如果执行java Test,那么

3、申请内存栈

这部分内容比较复杂,可以参考:http://15838341661-139-com.iteye.com/blog/1287866

4、输出内容

这方面咱们比较关心,查看代码:

3:   ldc     #3; //String Hello World!

这句话的意思是:将字符串Hello World!放入栈顶

invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V

这句话的意思是输出内容:Hello World!

详解JAVA输出Hello World的更多相关文章

  1. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  2. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的

    本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...

  3. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

  4. 详解java动态代理机制以及使用场景

    详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...

  5. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  6. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  7. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  8. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  9. 【转帖】windows命令行中java和javac、javap使用详解(java编译命令)

    windows命令行中java和javac.javap使用详解(java编译命令) 更新时间:2014年03月23日 11:53:15   作者:    我要评论 http://www.jb51.ne ...

随机推荐

  1. python测试开发django-31.admin后台一对多操作ForeignKey

    前言 平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息.一般会建两张表,一张表放银行的信息,一张表放银行卡信息. 每个银行可以对应多个银行卡,每个银行卡只 ...

  2. 好汉两个半第一季/全集Two And A Half Men迅雷下载

    第一季 Two and a Half Men Season 1 (2003)看点:Charlie是一个潇洒自由的单身汉,但正面临离婚危机的兄弟Alan带着儿子Jake的突然来访完全打乱了Charlie ...

  3. ios成长之每日一遍(day 2)

    接着下来简单说说Label(相当于android的textview)和button的使用, 由于都是与上篇的AppDelegate一致, 所以这一篇就说说ViewController与xib的使用呗. ...

  4. Mac环境配置 - iOS开发人员 -待续

    Mac环境记录 Mac 相关 目录相关 显示: $ defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏: $ default ...

  5. 抄袭证据之中的一个CMM与CMMI的名称

    以下文字来自我即将完毕的文章,谢博士说她没有抄袭,可是文中实在是有太多的漏洞了. 6.2.7 P120页中: "实际上终于所谓的统一方法论就是标准,尽管作标准并非目的.但标准是必须有的.能够 ...

  6. Check failed: mdb_status == 0 (13 vs. 0) Permission denied

    文件权限问题. chown或者chmod即可 另外注意lmdb文件的权限

  7. Swift:宏定义

    一.简述 swift中并没有加入宏系统,C语言使用#define定义的基本常量在导入Swift时被Swift编译自动转为Swfit语言的全局变量.但复杂的宏定义不能被Swift转换.Swift中类似宏 ...

  8. 相声段子:How Are You

    /**************************************************************** File name : HowAreYou Author : 叶飞影 ...

  9. N体运动的程序模拟

    这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引 ...

  10. libxml2 使用教程【转】

    https://blog.csdn.net/zhoudaxia/article/details/8565731# 本文整理自官方使用教程http://xmlsoft.org/tutorial/inde ...