您的位置:首页 > 编程语言 > Java开发

我们可以从Java“HelloWorld”中学到什么?

2020-02-02 12:26 253 查看

这是每个Java程序员都知道的程序。它很简单,但是简单的开始可以导致对更复杂概念的深入理解。在这篇文章中,我将探讨从这个简单的程序中学到什么。

1.为什么一切都从一堂课开始?

Java程序是从类构建的,每个方法和字段都必须在一个类中。这是由于它具有面向对象的功能:一切都是一个对象,它是一个类的实例。相对于功能性编程语言,面向对象的编程语言具有很多优势,例如更好的模块化,可扩展性等。

2.为什么总是有“主要”方法?

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

这是为什么?我们为什么不将非静态方法作为程序入口?

如果方法不是静态的,则需要先创建一个对象才能使用该方法。因为必须在对象上调用该方法。为了进入目的,这是不现实的。没有鸡肉,我们就无法获得鸡蛋。因此,程序进入方法是静态的。

参数“ String [] args”指示可以将字符串数组发送到程序以帮助程序初始化。

  1. HelloWorld的字节码

为了执行该程序,首先将Java文件编译为存储在.class文件中的Java字节码。字节码是什么样的?字节码本身不可读。如果我们使用十六进制编辑器,则如下所示:

我们可以在上面的字节码中看到很多操作码(例如CA,4C等),每个操作码都有一个对应的助记码(例如,在下面的示例中为aload_0)。操作码不可读,但是我们可以使用Javap来查看.class文件的助记符形式。

“ Javap -c”打印出该类中每个方法的反汇编代码。反汇编代码表示组成Java字节码的指令。

Javap -classpath。-c HelloWorld

上面的代码包含两种方法:一种是默认的构造函数,由编译器推断出来;另一种是默认的构造函数。另一种是主要方法。

在每种方法之下,都有一系列指令,例如aload_0,invokespecial#1等。可以在Java字节码指令列表中查找每个指令的作用。例如,aload_0将局部变量0的引用加载到堆栈上,getstatic获取类的静态字段值。请注意,在getstatic指令指向运行时常量池之后,将显示“#2”。常量池是JVM运行时数据区域之一。这使我们看一下常量池,可以使用“ Javap -verbose”命令来完成。

此外,每个指令都以数字开头,例如0、1、4等。在.class文件中,每个方法都有一个对应的字节码数组。这些数字对应于存储每个操作码及其参数的数组的索引。每个操作码的长度为1个字节,指令可以具有0个或多个参数。这就是为什么这些数字不连续的原因。

现在,我们可以使用“ Javap -verbose”进一步看一看该类。

Javap -classpath。详细的HelloWorld

从JVM规范开始:运行时常量池的功能类似于常规编程语言的符号表,尽管它包含的数据范围比典型的符号表还大。

“ invokespecial#1”指令中的“#1”指向常量池中的#1常量。该常量为“方法#6.#15;”。从数字中,我们可以递归获得最终常数。

LineNumberTable向调试器提供信息,以指示Java源代码的哪一行对应于哪个字节代码指令。例如,Java源代码中的第9行对应于main方法中的字节代码0,而行10对应于字节代码8。

如果您想了解更多有关字节码的信息,可以创建并编译一个更复杂的类以进行查看。HelloWorld确实是这样做的起点。

4.如何在JVM中执行?

现在的问题是,JVM如何加载类并调用main方法?

在执行main方法之前,JVM需要1)加载,2)链接和3)初始化类。1)加载将类/接口的二进制形式带入JVM。2)链接将二进制类型的数据合并到JVM的运行时状态中。链接包括3个步骤:验证,准备和可选的解决方案。验证可确保类/接口在结构上正确;准备工作涉及分配类/接口所需的内存;分辨率解析符号引用。最后3)初始化为类变量分配了适当的初始值。

此加载作业由Java类加载器完成。启动JVM时,将使用三个类加载器:

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

  2. 扩展类加载器:将代码加载到扩展目录中(例如, / jar / lib / ext)。

  3. 系统类加载器:加载在CLASSPATH上找到的代码。

因此,HelloWorld类由系统类加载器加载。当main方法执行时,它将触发其他依赖类的加载,链接和初始化(如果存在)。

最后,将main()框架压入JVM堆栈,并相应地设置程序计数器(PC)。PC然后指示将println()帧推送到JVM堆栈。当main()方法完成时,它将从堆栈中弹出并执行完毕。转自 http://www.learnfuture.com/Java/7846

  • 点赞
  • 收藏
  • 分享
  • 文章举报
学领未来 发布了0 篇原创文章 · 获赞 0 · 访问量 1316 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: