java中HelloWorld的执行流程

HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家!

贴出HelloWorld的代码如下:

 

public class HelloWorld {
  public static void main(String[] args)
  { 
   String s ;
   s = “Hello World!”; //定义字符串s
   System.out.println(s); 
  }
}

 

 

分析内存图:


java中HelloWorld的执行流程_第1张图片
 HelloWorld的具体执行过程:

1.执行HelloWorld.java文件,生成HelloWorld.class字节码文件;

2.虚拟机执行HelloWorld.class,将这个类加载到内存中(即方法区的类代码区中);

3. 虚拟机通过类找到HelloWorld的主方法(程序的入口方法),访问权限为public(公有可用),虚拟机传递String[](字符串数组对象:空数组)类型参数的地址到主方法的args中去,并在栈区为args开辟内存空间,返回一个void的返回值;

4.定义一个String(标准类库中的)类型的变量(在栈区开辟空间)s,s的值不确定(垃圾值,编译无法通过);

5. s = “Hello World!”,对象“Hello World!”在方法区的常量数据区开辟空间,属性即为:Hello World!,方法即为:toString(),变量s存放对象“Hello World!”的地址;

6. 虚拟机找到标准类库中的System.class类并加载到内存中(即方法区的类代码区中),System.out为标准字节输出流对象(),并调用println()方法将变量s的值打印到屏幕上。

 

PS: 虚拟机调用主方法时会创建三个默认对象:System.out(标准字节输出流对象)、System.in(标准字节输入流对象)和System.error(标准字节出错流对象).

以上共涉及:

1个java文件:HelloWorld.java

4个class类: HelloWorld.class、String[].class、String.class、System.class

5个对象: “Hello World!”、String[]、System.out、System.in、System.error

2个变量:args、s

3个方法:main()、toString()、println()

 

===========================================================

 

1、为什么一切都是从类开始?

 

Java程序是从类开始构建的, 每个方法和字段都必须在类里面。这是由于Java面向对象的特性: 一切都是对象,它是类的一个实例。面向对象编程语言相比函数式编程语言有许多的优势,比如更好的模块化、可扩展性等等。

 

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

 

main方法是程序的入口,并且是静态方法。static关键字意味着这个方法是类的一部分,而不是实例对象的一部分。为什么会这样呢? 为什么我们不用一个非静态的方法作为程序的入口呢?

 

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

 

参数 “String[] args”表明可以将一个字符串数组传递给程序来帮助程序初始化。

 

3、HelloWorld在JVM中是如何执行的?

 

现在的问题是JVM是怎样加载这个类并调用main方法?

 

在main方法执行之前, JVM需要加载、链接以及初始化这个类。

1. 加载将类/接口的二进制形式装入JVM中。

2. 链接将二进制类型的数据融入到JVM的运行时。链接由3个步骤组成:验证、准备、以及解析(可选)。验证确保类、接口在结构上是正确的;准备涉及到为类、接口分配所需要的内存;解析是解析符号引用。

 

3. 最后,初始化为类变量分配正确的初始值。

 

 


java中HelloWorld的执行流程_第2张图片

 

加载工作是由Java类加载器来完成的。当JVM启动时,会使用下面三个类加载器:

 

Bootstrap类加载器:加载位于/jre/lib目录下的核心Java类库。它是JVM核心的一部分,并且使用本地代码编写。

扩展类加载器:加载扩展目录中的代码(比如/jar/lib/ext)。

系统类加载器:加载在CLASSPATH上的代码。

所以,HelloWorld类是由系统加载器加载的。当main方法执行时,它会触发加载其它依赖的类,进行链接和初始化。前提是它们已经存在。

 

 

最后,main()帧被压入JVM堆栈,并且程序计数器(PC)也进行了相应的设置。然后,PC指示将println()帧压入JVM堆栈栈顶。当main()方法执行完毕会被弹出堆栈,至此执行过程就结束了。


 

你可能感兴趣的:(java)