Java讲义第一章学习笔记
Chapter 1 Java语言概述与开发环境
1.2 java程序运行机制
--1.2.1 高级语言的运行机制
计算机高级语言按程序的执行方式可以分为:编译型和解释型
编译型语言时一次性地编译成特定平台上的机器码,因此编译可以脱离开发环境独立运行,而且通常运行效率较高;但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行程序通常无法移植到其他平台上运行;
现有的C、C++ .......都属于编译型语言。
解释型语言每次执行都要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可。
现有的Javascript、Ruby、Python 等语言都属于解释型语言。
--1.2.2 Java程序的运行机制和JVM
Java需要经过编译和解释两个步骤,但编译步骤不会生成特定平台的机器码,而是生成一种与平台无关的字节码(class文件),这种字节码是不可执行的,必须由Java解释器来解释执行。
Java源文件 -------使用javac编译------->编译生成.class文件--------使用java解释执行-------->特定平台机器码
Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能够理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转化成特定系统的机器码执行,从而提高执行效率。
JVM所包括内容:
- 指令集
- 寄存器
- 类文件的格式
- 栈
- 垃圾回收堆
- 存储区
1.3 开发Java的准备
--1.3.1 下载和安装JDK
相关要点:
-
- 下载JDK网站:http://www.oracle.com/......
- 设置JDK的安装路径:D:\Java\jdk-xx.x.x\
安装完成后,可以在JDK安装路径下看到如下的文件路径:
-
- bin:该路径下存放了JDK的各种工具指令,常用的javac、java等命令就放在该路径下。
- conf:该路径下存放了JDK的相关配置文件。
- include:存放一些平台特定的头文件。
- jmods:该目录下存放了JDK的各种模块。
- legal:该目录下包含了JDK各模块的授权文档
- lib:该路径下存放的是JDK工具的一些补充JAR包。比如src.zip文件中保存了Java的源代码。
--1.3.2 设置PATH环境变量
1.在Windows平台上设置环境标量
右击桌面上的“计算机”图标,出现右键菜单;单击“属性”菜单项,系统显示“控制面板\所有控制面板项\系统”窗口(也可以通过控制面板中的“系统”项来打开该窗口),单击该窗口左边栏中的“高级系统设置”链接,出现“系统属性”对话框,单击该对话框中的“高级”Tab页,再单击右下方的环境变量对话框,通过该对话框可以修改或添加环境变量。如下图
选择名为Path的变量,点击编辑,在其后追加环境变量值:D:\Java\jdk-xx.x.x\bin(其中 D:\Java\jdk-xx.x.x\ 是JDK的安装路径)。
2.在Linux上设置环境变量
启动Linux的终端窗口(命令行界面),进入当前用户的home路径下,然后在home路径下输入如下命令:
ls -a
该命令将列出当前路径下所有的文件,包括隐藏文件,Linux平台的环境变量是通过 .bash_profile 文件来设置的。使用无格式的编译器打开该文件,在该文件的PATH变量后添加:/home/**/Java/jdk-xx.x.x/bin,其中 /home/**/Java/jdk-xx.x.x/ 是JDK的安装路径。修改后的PATH变量设置如下:
# 设置PATH环境变量 PATH=.:$PATH:$HOME/bin:/home/**/Java/jdk-xx.x.x/bin
Linux平台中多个路径之间以冒号(:)作为分隔符,而$PATH则用于引用原有的PATH变量值。
完成了PATH变量值的设置后,在bash_profile文件最后添加导出PATH变量语句,如下所示:
# 导出PATH环境变量
export PATH
重新登录Linux平台,或者执行如下命令:
source .bash_profile
使文件中设置的PATH变量值生效。
1.4 第一个Java程序
--1.4.1 编写Java源代码
public class HelloWorld
{
//java程序的入口方法,程序将从这里开始执行
public static void main(String[] args)
{
//向控制台打印一条语句
System.out.println("Hello World!");
}
}
--1.4.2 编译Java程序
通常,总是将生成的文字码文件放在当前路径下,当前路径可以用点(.)来表示。在命令行窗口进入HelloWorld.java文件所在路径,在该路径下输入如下命令:
javac -d . HelloWorld.java
运行该命令后,在该路径下生成一个HelloWorld.class文件。
补充:
在EditPlus中集成javac命令按如下步骤进行。
- 选择EditPlus的“工具” -->“配置用户工具”菜单,弹出下图对话框。
- 单击“组名称”按钮来设置工具组的名称,例如输入“编译运行Java”。单击“添加工具”按钮,并选择“程序”选项,然后输入javac命令的用法和参数,输入成功后如下图所示的界面。
3.单击“确定”按钮,返回EditPlus主界面。再次选择EditPlus的“工具”菜单,将看到该菜单中增加了“编译Java程序”菜单项,单击该菜单项即可编译EditPlus当前打开的Java源程序代码。
--1.4.3 运行Java程序
通过命令行窗口进入HelloWorld.class所在的路径,输入如下的命令:
java HelloWorld
运行上面命令,将会看到如下输出:
Hello World!
这表明Java程序运行成功。(注:必须严格区分大小写)
补充:
在EditPlus中集成java命令如下图。
--1.4.4 根据CLASSPATH环境变量定位类
实际上,如果使用1.5及以上版本的JDK,完全可以不用设置CLASSPATH环境变量-------正如上面编译,运行Java程序所见到的,即使不设置CLASSPATH环境变量,完全可以正常编译和运行Java程序。
那么CLASSPATH环境变量的作用是什么呢?当使用“java Java 类名”命令来运行Java程序时,JRE到哪里去搜索Java类呢? 答:在当前路径下搜索。但1.4以前版本的JDK都没有设计这个功能,这意味着即使当前路径包含了HelloWorld.class,并在当前路径下执行“javac HelloWorld”,系统一样提示找不到HelloWorld类。
如果使用1.4以前版本的JDK,则需要在CLASSPATH环境变量中添加点(.),用以告诉JRE需要在当前路径下搜索Java类。除此之外,编译和运行Java程序还需要JDK的lib路径下dt.jar和tool.jar文件中的Java类,因此还需要把这两个文件添加到CLASSPATH环境变量里。
当然,即使使用JDK 1.5以上版本的JDK,也可以设置CLASSPATH环境变量(通常用于加载第三方类库),一旦设置了该环境变量,JRE将会按该环境变量指定的路径来搜索Java类。这意味着如果CLASSPATH环境变量中不包括点(.),用于代表当前路径。
如果想在运行Java程序时临时指定JRE搜索Java类的路径,则可以使用-classpath选项(或用-cp选项,-cp是简写,作用完全相同),即:
java -classpath dir1;dir2;dir3;...;dirN Java类
-classpath 选项的值可以是一系列的路径,多个路径之间在Windows平台上以分号(;)隔开,在Linux平台上以冒号(:)隔开。
如果在运行Java程序时指定了-classpath选项的值,JRE将严格按-classpath选项所指定的路径来搜索Java类,即不会在当前路径下搜索Java类,CLASSPATH环境变量所指定的搜索路径也不再生效。
如果希望CLASSPATH环境变量指定的搜索路径依然有效,而且还会在当前路径下搜索Java类,则可以按如下格式来运行Java程序。
java -classpath %CLASSPATH%; . ;dir1;dir2;dir3;...;dirN Java类
上面命令通过%CLASSPATH%来引用CLASSPATH环境变量的值,并在-classpath选项的值里添加了一个点,强制JRE在当前路径下搜索Java类。
1.5 Java程序的基本规则
--1.5.1 Java程序的组织形式
Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单元。
最简单的Java程序:
class Test
{
}
这个程序定义了一个空类。使用javac命令来编译这个程序,不会出现编译错误。但如果使用java命令来运行上面的Test类则会出现如下错误:
错误:在类 Test 中找不到 main 方法,请用 main 方法定义为:public static void main(String[] args)
上面的错误提示仅仅表明:这个类不能被java命令解释执行,并不表示这个类是错误的。实际上,Java解释器规定:如需某个类能被解释器直接解释执行,则这个类里必须包含 main 方法,而且 main 方法必须使用 public static 修饰 ,必须使用 void 声明该方法的返回值 ,且 main 方法的形参必须是字符串数组类型(String[] args 是字符串数组形式)。因此, main 是Java程序的入口。
--1.5.2 Java源文件的命名规则
- Java程序源文件的扩展名必须是 .java,不能是其他文件扩展名。
- 在通常情况下,Java程序源文件的主文件名可以是任意的。但有一种情况例外:如果Java程序源代码里定义了一个public类,则该源文件的主文件名必须与该 public 类的类名相同。因此,一个Java源文件里最多只能定一个 public 类。
一个Java源程序可以包含多个类定义,各个类之间完全独立,只是定义在同一个源文件中而已。如下:
class Dog
{
}
class Cat
{
}
class bird
{
}
上面程序使用同一个源文件定义了3个独立的类:Dog,Cat,Bird。使用 javac 命令编译该Java程序,将会生成3个 .class 文件,每个类对应一个 .class 文件。
命名几点建议:
- 一个Java源文件通常只定义一个类,不同的类使用不同的源文件定义。
- 让Java源文件的主文件名与该源文件中定义的 public 类同名。
补充:如何关闭隐藏文件扩展名功能(Windows)
https://jingyan.baidu.com/album/f00622282564bdfbd3f0c827.html?picindex=1
1.6 交互式工具:jshell
从JDK 9 开始,JDK内置了一个强大的交互式工具:jshell。它是一个REPL(Read-Eval_Print Loop)工具,该工具是一个交互式命令行界面,可用于执行Java语言的变量声明、语句和表达式,而且可以立即看到执行结果。因此,可以使用该工具来测试Java的新的API。
启动 jshell 只需在命令行窗口输入 jshell 命令,即可进入 jshell 交互模式。
常用指令:
-
- /help : 常看帮助信息。
- /exit : 退出。
- /list : 列出用户输入的所有源代码。
- /edit : 编辑用户输入的第几条源代码。
- /drop : 删除用户输入的第几条源代码。
- /save : 保存用户输入的源代码。
- /vars : 列出用户定义的所有变量。
- /methods : 列出用户定义的全部方法。
- /type : 列出用户定义的全部类型。