0
点赞
收藏
分享

微信扫一扫

1.1.2.1 编写源代码并运行

朱悟能_9ad4 2022-04-13 阅读 29
java

文章目录

2.1 编写源代码并运行

内容导视:

  • 创建 .java 文件编写源码
  • 配置环境变量
  • 查看命令使用帮助
  • 解释代码含义
  • 编译与运行

2.1.1 创建 .java 文件编写源码

我们要开始写源代码啦!但只是在 DOS 窗口中输出一句话而已…

创建以 .java 结尾的文件,如 Hello.java。(以后统称为后缀或扩展名,打开文件资源管理器,查看,勾上文件扩展名)文件右击选择打开一种打开方式。(EditPlus 或其他文本编辑器,找不到选择其它应用,然后选中“始终使用此应用打开此类型的文件”复选框)这样你以后双击 .java 文件就可以直接使用此软件打开啦。

双击此文件,输入如下。还是直接复制、粘贴吧,记得保存。(Ctrl + S)

public class Hello {
	public static void main(String[] args) {
		System.out.println("hello world!");
	}
}

打开 DOS 窗口,使用 cd 命令切换到此文件的所在目录

(如果你在桌面上创建的文件,路径是 C:\Users\自己的用户名\Desktop,你可以自己打开文件资源管理器,点击左边的桌面图标,在地址栏上输入 cmd 后回车)

屏幕截图 2022-03-22 113317

在 DOS 窗口中输入 javac Hello.java,得到如下诡异的结果。

'javac' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

你可能会疑惑?怎么没有找到这个命令,不是在 JDK 的安装路径\bin 目录下有 javac.exe 命令吗?你说找不到?那为什么之前 DOS 窗口查看 IP 时,也就是C:\Windows\System32下的 ipconfig 命令就可以执行?

此电脑右键/属性/高级系统设置/环境变量/系统变量/Path 下看到了 %SystemRoot%\system32,即 C:\Windows\System32

(如果桌面上没有此电脑图标)

  • 打开文件资源管理器,此电脑的图标在左边。
  • 或者 Windows + i打开设置,点击系统/关于,往下翻,相关设置/高级系统设置。
  • 右键/个性化/主题/桌面图标设置,勾选计算机图标后点击应用和确定。

猜想:难道系统只会在 Path 指定的路径下寻找命令吗?我随手就删了它(别试,否则手动还原),确定保存刚刚的修改操作,重新打开 DOS 窗口,再次执行 ipconfig,很明白了。

得出结论:执行的程序如果在当前目录下不存在,系统会在名为 Path 的环境变量指定的目录下查找

好的,大概明白了,但我的电脑上有多个用户,那么为了不影响其他用户,我只配置用户变量的 Path,优先级当然没有系统变量的高。(系统变量针对所有用户生效)

2.1.2 配置环境变量

上节知道了 Path 变量的作用,现在该把命令地址添加到 Path 中了。

双击 Path,添加 javac 命令所在路径。(如果你还记得 JDK 安装的位置,打开 bin 目录,复制地址栏上的地址)

如果这个 JDK 安装目录,以后会重复使用(不用怀疑,肯定了)。为了方便,新建变量 JAVA_HOME 保存 JDK 安装目录,供其它地方使用。

再把之前的 javac 命令所在路径替换成 %JAVA_HOME%\bin

%JAVA_HOME% 代表变量 JAVA_HOME 对应的值。以后 JavaEE、开发工具需要获取 JDK 的安装目录,这样就不需要再手动设置了。

有的人可能版本较老,Path 变量值在一行文本框上显示。那么添加路径时,注意路径与路径之前使用;分隔,注意这个分号是英文状态下的半角符号,你按下 Shift,看看电脑右下角是否中英在切换。写成就错了。以后如果不说明,统一使用英文状态下的符号。

例:

检查自己是否配置好了:

打开 DOS 窗口,输入 java -version 和 javac 等命令
如果显示版本信息,证明 java.exe 是可以用的

再输入 echo %Path%
查看刚刚配置的 JDK的家\bin 路径是否在其中

有的人可能有疑惑,明明自己没配环境变量,为什么 java.exe 可以使用?

答:使用 exe 文件安装 JDK 后,会自动在系统变量 Path 添加如下图路径:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath

所以没有手动配置环境变量时,java 命令可以用,但 javac 不行。

每次改动,都需要重新打开 DOS 窗口,配置才能生效。输入 javac Hello.java,如果你的语法正确,就会在当前路径下生成 class(字节码)文件,再输入 java Hello ,此时别带后缀。

有人就说了,每次运行 class 文件,都要使用 cd 命令进入此目录,再执行命令很麻烦。那么可以通过 classpath 变量指定字节码文件所在位置。

新建环境变量 classpath:

.是英文输入的句号,代表当前路径,如果不写就不会从当前路径寻找 class 文件。
由于我习惯把 class 文件放在桌面上,于是新增了桌面的路径,路径和路径直接使用;分隔,别使用中文的分号

这样不管在任何地方,输入 java Hello 就可以执行了。

总结

Path 是 Windows 查找 .exe 文件的路径;classpath 是 JVM 查找 .class 文件的路径;如果你以后学会了如何打 jar 包,假如它的绝对路径为 E:\a\c\d\Tool.jar,如果想任何位置敲 java -jar Tool.jar 让 jar 包执行,就可以把 E:\a\c\d\Tool.jar 加到 classpath 变量值里。

2.1.3 查看命令使用帮助

也许你总是会忘记,此命令应该携带什么参数…

想要执行的命令 -help,例举了可加的参数,如 -encoding。(对不起,我要给你埋坑了,如果你事先不知道此参数的作用…)

javadoc -helpjavac -help。(其实不加 -help 也行)

看,这不就出来了:

image-20220322120929241

2.1.4 解释代码含义

看不懂很正常,学完面向对象就懂了。突然遇到看不懂的不要怀疑自己智力有问题,只是还没到这步而已,大不了直接跳过。

public class Hello {
    // args 是变量名,可以根据标识符的命名规则取名
	public static void main(String[] args) {
		System.out.println("hello world!");
	}
}

从头开始说吧。

  • 关键字 public 是访问修饰符,表明该类是一个公共类,可以控制其他对象对类成员的访问。
  • 关键字 class 用于声明一个类,其后所跟的 Hello 是类名。
  • Hello 后跟的 {} 称为类体,包含了方法、字段…
  • public static void main(String[] args) {}:这个是 main 方法,由于被 JVM 调用,也被称为主方法、入口方法。所有 java 代码都是最先从入口方法开始执行的。
    • main 后的 {} 称为方法体,包含了 java 语句。
    • 关键字 static 表示该方法是一个静态方法,无须创建类的实例即可调用。
    • 关键字 void 表示此方法没有返回值。
    • void 后面的是方法名 main。
    • main 后的括号包含一个形式参数,这个形参是 String 类型的数组,参数名是 args。
    • System.out.println(“”); 是 java 语句,代表打印(输出)括号中的内容到控制台(DOS 窗口)。
    • “hello world!” 是一个字符串。
    • ; 代表一条 java 语句的结束。

2.1.5 编译与运行

(字节码文件是 class 文件,由源代码中定义的 class 生成)

过程如下:

首先新建后缀为 java 的文件,编写出符合语法规则的代码。

编译:经过 javac 源文件名.java 命令编译生成字节码文件;

运行:使用 java 类名 命令在 JVM 虚拟机上运行此字节码文件,JVM 会调用此类的 main 方法。

(补充:因为一个源文件可以定义多个类,编译后生成多个 class 文件,所以 java 命令后面跟的不一定是源文件名)

编译

.java 文件是 java 的源文件,但是不能直接运行,必须先被编译成为 .class 文件才能够执行。别问,问就是电脑太笨,看不懂。

class 文件也称为字节码文件,上面的 javac 源文件名.java 就是编译的过程。

编译期将源码交给编译器,编译成可以被 JVM 识别的字节码,如果源代码不符合语法规则,就会报错(错误提示很智能,可以根据报错信息相应找到原因,自己试试比如删除一个大括号、引号等,看看 javac 命令给你报什么错)

运行

(当源文件修改后,必须重新编译才能生效)

编译后生成 class 字节码文件,使用 java class文件名 运行,别加 .class 后缀。

运行期类加载器(Class Loader)找字节码文件(如果没有配 classpath,默认从当前路径下找),找到了就加载字节码文件到 JVM 虚拟机,JVM 启动解释器对字节码文件进行解释,生成的二进制码读到内存中,由操作系统进行二进制码的执行。

字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,编程人员和计算机都无法直接读懂字节码文件。它是一种二进制文件,是 Java 源文件由 Java 编译器编译后生成的目标代码文件。它必须由专用的 Java 解释器来解释执行,因此 Java 是一种在编译基础上进行解释运行的语言。

C 语言中文网下的解释,我觉得还行吧。我没玩过 C 语言,说什么就先听着,之后再忘掉就 OK 了。


1)将所有源代码一次性转换成二进制指令(也就是生成一个可执行程序,如 Windows 下的 .exe)
的转换工具称为编译器

比如 C 语言、C++ 的 GCC、Golang 的 GCC GO 等,源代码改动需要重新编译一次。

2)翻译一句,执行一句,不会生成可执行程序。
比如 Python 的 CPython 等,这种的转换工具称为解释器。

3)Java 和 C# 是一种比较特殊的存在。
如 java 有编译器 javac,但编译后的 class 文件计算机无法执行,还需要 java 解释器进行翻译。

它们的源代码需要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。
Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾执行效率;

C# 是后来的跟随者,但是 C# 一直止步于 Windows 平台,在其它平台鲜有作为。


Java 解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此 Java 程序不能直接运行在现有的操作系统平台上,它必须运行在被称为 Java 虚拟机的软件平台之上。

Java 虚拟机(JVM)是运行 Java 程序的软件环境,Java 解释器是 Java 虚拟机的一部分。在运行 Java 程序时,首先会启动 JVM,然后由它来负责解释执行 Java 的字节码程序,并且 Java 字节码程序只能运行于 JVM 之上。这样利用 JVM 就可以把 Java 字节码程序和具体的硬件平台以及操作系统环境分隔开来,只要在不同的计算机上安装了针对特定平台的 JVM,Java 程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的。

JVM 把这种不同软、硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级的跨平台移植。JVM 是 Java 平台架构的基础,Java 的跨平台特性正是通过在 JVM 中运行 Java 程序实现的。

Java 语言这种“一次编写,到处运行”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。

提示:Java 程序通过 JVM 可以实现跨平台特性,但 JVM 是不跨平台的。也就是说,不同操作系统之上的 JVM 是不同的,Windows 平台之上的 JVM 不能用在 Linux 平台,反之亦然。

举报

相关推荐

0 条评论