疯狂Java讲义第五版第1章 Java语言概述与开发环境

1.2 Java程序运行机制

Java语言具有解释型语言、编译型语言的特征,因为Java程序要经过先编译、后解释两个步骤。

1.2.1 高级语言的运行机制

计算机高级语言按程序的执行方式可以分为编译型和解释型两种。

编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性地“翻译成”可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行程序的格式,这个转换过程称为编译(Compile),编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行。

编译型语言一次性地编译成特定平台上的机器码,可以脱离开发环境独立运行,效率较高;但因为针对特定平台,因此编译成的可执行程序通常无法移植到其他平台上运行;如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。

现有的C,C++,Objective-C,Swift,Kotlin等高级语言都属于编译型语言。

解释型语言是使用专门的解释器,对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。

每次执行解释型语言的程序都需要进行一次编译,因此解释性语言的程序运行效率通常较低,且不能脱离解释器独立运行;但其跨平台容易,特定平台上的解释器负责将源程序解释称特定平台的机器指令即可,方便地实现源程序级的移植,但以牺牲程序执行效率为代价。

现有的JavaScript、Ruby、Python等都属于解释型语言。

在这里插入图片描述

1.2.2 Java程序的运行机制和JVM

Java程序的执行过程必须经过先编译、后解释两个步骤,如图1.1所示。
(1)使用javac将源文件编译成字节码.class文件
(2)使用java虚拟机JVM解释执行平台无关的字节码程序
在这里插入图片描述
在这里插入图片描述

Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会把虚拟机代码转换为特定系统的机器码执行,从而提高执行效率。

当使用Java编译器编译Java程序时,生成与平台无关的字节码文件(.class),只面向JVM,不同平台上的JVM不同但都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行
相同的字节码程序能在不同的平台上运行,靠的就是“中间转换器”JVM。

JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。

Oracle公司制定的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了JVM的如下细节: 指令集、寄存器、 类文件的格式、 栈、 垃圾回收堆、存储区,制定这些规范的目的是为了提供统一的标准,最终实现Java程序的平台无关性。

1.3 开发java的准备

安装并配置java开发环境
JDK:Java SE Development Kit,Java标准版开发包,它提供了编译、运行 Java 程序所需的各种工具和资源,包括 Java 编译器、 Java运行时环境JRE,以及常用的 Java 类库等。
JRE: Java Runtime Environment,Java运行时环境,是运行java程序的必要条件。
在这里插入图片描述

1.5 Java程序的基本规则

1.5.1 Java程序的组织形式

Java 程序是一种纯粹的面向对象的程序设计语言,因此 Java 程序必须以类 (class) 的形式存在,类 (class) 是Java程序的最小程序单位,Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。

Java 解释器规定:如需某个类能被解释器直接解释执行,则这个类里必须包含main方法,而且main方法必须使用 public static void 来修饰,且main方法的形参必须是字符串数组类型 (String[] args 是字符串数组的形式) 。也就是说,main方法的写法几乎是固定的,public static void main(String [] args) ,Java虚拟机就从这个 main 方法开始解释执行,因此,main方法是Java程序的入口。
对于那些不包含main方法的类,也是有用的类 对于一个大型的 Java 程序而言,往往只需要一个入口,也就是只有一个类包含 main 方法,而其他类都是用于被 main 方法直接或间接调用的

1.5.1 Java源文件的命名规则

一个Java源文件可以包含多个类定义,各个类之间完全独立,只是定义在同一个源文件中而已。但一个Java源文件最多只能包含一个public类定义,如果Java源文件里包含public类定义,则该源文件的文件名必须与这个public类的类名相同。

通常有如下建议
1. Java 源文件只定义一个类,不同的类使用不同的源文件定义。
2. 让 Java 源文件的主文件名与该源文件中定义的 public 类同名。

1.7 Java的垃圾回收器

Java不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的,JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收 (Garbage Collection , GC)。 通常JRE会提供一个后台线程来进行检测和控制,一般都是在CPU空闲或内存不足时自动进行垃圾回收,而程序员无法精确控制垃圾回收的时间和顺序等。

Java规范没有明确地说明 JVM 使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做两件基本的事情:
(1)发现无用的对象; (2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值