一、问题背景
博主在准备应聘的笔试、面试时,再次采用了多年以来的Java工具书《Java疯狂讲义》,并决定在每章详细复习后都要在博客中写下详细的阅读笔记。
二、阅读笔记与知识拓展——《Java疯狂讲义》第1章(Java语言概述与开发环境)
1.1Java语言的发展简史
Sun公司开发了Java语言,Oracle公司收购了Sun公司。
1.2.1高级语言的运行机制
计算机高级语言(C、C++、C#、Java、Python等)按程序的执行方式分为编译型和解释型。
- 编译型语言:针对特定的操作系统,专门的编译器将高级语言源代码
一次性地编译(compile)
成可被该操作系统硬件执行的机器码(别名:机器指令,机器语言)
,并链接打包(link)
成该操作系统所能识别的可执行性程序的格式(如Windows的exe可执行程序)。
编译型语言特点:
(1)编译型语言是一次性地编译生成机器码,所以可以脱离开发环境独立运行,且运行效率高;
(2)编译型语言程序被编译成特定平台的机器码,故无法移植到其他操作系统; - 解释型语言:专门的编译解释器对解释型语言程序编译解释成特定操作系统的机器码并立即执行。
解释型语言特点:
(1)每次运行都要将源代码编译解释成机器码并执行,效率低;
(2)跨平台容易,每个操作系统的编译解释器将源程序解释成对应的机器码即可,源程序移植方便;
1.2.2Java程序的运行机制和JVM
JavaC编译器编译
Java虚拟机JVM解释执行
.java源文件
.class字节码文件
特定平台机器码
上述流程图便是Java程序的运行机制:Java源文件由JavaC编译器编译生成class字节码文件,再由Java虚拟机JVM解释执行为特定平台的机器码。
其中,JavaC全称为Java Compiler;JVM全称为Java Virtual Machine。
Java虚拟机JVM是个虚拟计算机,跟实际计算机一样,它具有指令集、寄存器、类文件的格式、栈、垃圾回收堆、存储区等。Java虚拟机JVM不仅负责人执行指令,还要管理数据、内存和寄存器。
1.3开发Java的准备
JDK全称为Java Development Kit;JRE全称为Java Runtime Environment。
Oracle把Java分为Java SE、Java EE和Java ME。
Java SE全称为Java Standard Edition;Java EE全称为Java Enterprise Edition;Java ME全称为Java Micro Edition。
1.4.2编译Java程序
编译Java程序需要Java命令,应安装Java时已经把Java命令所在的路径添加到系统的PATH环境变量中,故cmd.exe命令行窗口可在任意路径下使用javac命令来编译Java程序。
javac -d destdir srcFile
上述命令便是编译生成字节码文件的Java命令。其中,Javac
指Java Compiler;-d
指directory;destdir
指destination directory;srcFile
指source file。
上述命令的实际例子如下:
javac -d . HelloWorld.java
当前路径用点(.)来表示,该命令的含义:cmd.exe命令行窗口在当前路径找到HelloWorld.java源文件,并将其编译为HelloWorld.class文件存储在当前路径。
Javac编译生成的.class字节码文件有默认的文件名:文件名总是以Java源文件所定义类的类名作为文件名,并以.class作为后缀名。
javac -d . HelloWorld.java
命令甚至可以简写为javac HelloWorld.java
,简写后的命令指在当前路径找到HelloWorld.java并编译生成HelloWorld.class于当前目录下。
但是javac HelloWorld.java
不可以再简写为javac HelloWorld
了,否则JavaC会报错该命令,提示:仅当显式请求注释处理时才接受类名称 'JavaArgsTest' 1 个错误
。
1.4.3运行Java程序
运行Java程序要使用如下的Java命令:
java Java源文件类名
值得注意的是:java命令后的参数是Java源文件类名,而不是字节码文件的文件名,也不是Java源文件名。并且在运行Java程序之前必须要编译.java源文件
后生成的.class文件
,因为运行Java程序的命令java Java源文件类名
就是找当前路径的.class文件
的Java源文件类名,如果当前路径仅有.java源文件
,运行Java程序的命令java Java源文件类名
就会报错。
若当前路径有HelloWorld.class
,那么Java命令的实际运行例子如下:
java HelloWorld
1.5Java程序的基本规则
1.5.1Java程序的组织形式
Java是纯粹的面向对象的高级语言,因此Java必须以类(class)的形式存在,类是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分必须放在类的定义里。
Java编译解释器规定:某个类能被编译解释器直接编译解释执行,则这个类必须包含main方法,而且main方法必须用public static void修饰,且main方法的形式参数必须是字符串数组类型(String[] args是字符串数组的形式)。main方法是Java程序的入口,Java虚拟机就从main方法开始编译解释执行。
不包含main方法的类也是有用的类。对于一个大型Java程序而言,其需要一个入口,即只有一个包含main方法的类,而其他类都是用于被main方法直接或间接调用的。
1.5.2Java源文件的命名规则
通常,Java源文件的文件名可以是任意的。但若一个Java源文件中定义了一个public类,则该源文件的文件名必须与该public类的类名相同。
由于Java源文件的文件名必须与public类的类名相同,故一个Java源文件最多只能定义一个public类。
虽然一个不包含public类的Java源文件的文件名命名是任意的,但是为了程序的可读性,一个Java源文件最好只定义一个类,且Java源文件的文件名与该类的类名相同。
1.5.3初学者容易犯得错误
Java是严格区分大小写的。
Windows操作系统中不区分大小写,但Linux操作系统区分大小写。
1.7Java9的G1垃圾回收器
内存泄漏(Memory Leak):程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃的情况。
在C/C++中,类的对象所占用的内存不会被主动释放。若对象所占用的内存不被显示释放,内存会一直被占用,从而导致内存泄漏。
Java中的JRE负责回收无用内存,这种机制被称为垃圾回收机制(Garbage Colelction, GC)。垃圾回收机制可提高编程效率,保护程序的完整性,但会影响程序性能。