您的位置 首页 java

第一个 Java 应用程序

第一个 JAVA 应用程序

java 17(JDK 17) 版本的第一个 Hello World 程序。并详细的讲解 javac 命令和 java 命令使用。

为什么用 Hello World 开始

Hello World 中文意思是『你好,世界』。因为 The C Programming Language 中使用它作为第一个演示程序,在编程学习中非常著名,所以后来的程序员在学习编程或进行设备调试时延续了这一习惯。我们也不例外。因为这段代码相对简单, 但是知识点也足够新手学习享用。

让我们使用这个最简单的程序进入到 Java 的学习之旅中。

执行 Java 程序需要 3 个步骤, 1. 编写代码,2. 编译代码,3. 执行代码。

第一步:编写 Java 源代码

直接上代码(截图和代码都会出现,截图是为了更好的看, 代码是为了更好的 copy 和复用 ):

 /**
 * 第一个 Java 程序
 */public class Hello {
    
    /**
     * 执行的主函数
     * @param args 接收参数
     */    public  static   void  main(String[] args) {
        System.out.println("Hello, 苗子说全栈带你零基础学 Java。");
    }
}  

从我们编写第一个程序开始, 就需要注意一些 Java 的规法和约定。并且还有 Java 的语法结构。

第一个要点:Java 是一个区分大小写的 编程语言 。所以 a 和 A 是不同的。

第二个要点:Java 有内置的关键字, 例如 class public static void 等。

第三个要点:Java 包含 源代码 范围使用 大括号 “{}” 来标识一个代码块。

第四个要点:Java 是面向对象的语言, 所以会有类 class 的概念。

简单的讲解一下该 源码

class Hello: 代表着定义个“类”, 类名叫作:“Hello”,Java是个面向对象的语言。而类是面向对象的定义规则, 一个类就是一个对象。除了 Java 的基础类型, 其他的都是对象类型。

main: 并且指定了一个 main 方法, 这个是 Java 的默认主函数。固定格式为:public static void main(String[] args);

System.out:是系统的输出文件。输出一串内容到控制台。初学者必须要接触的一个概念, 控制台。

第二步:编译 Java 源代码

在前面的章节中我们分析了 Java 的 运行机制 ,知道想运行一个 Java 程序, 需要先编译成 java 虚拟机 JVM )能够识别的字节码。 而 Java 的编译就是使用命令 javac

使用方式为: javac [选项] 源码文件名

执行代码的命令为: javac Hello.java

因为我这系统默认是GBK, 而我选用的是 utf-8 。虽然不应该这么早的就接触编码集, 但是还是要说一句, 以后的开发为了统一编码建议统一采用 UTF -8 的编码集进行开发。当然你也可以在编写代码的时候, 文件使用 GBK 国标码也可以使用。修改文件的编码格式:GB 2312

在 VS Code 中红色圈住的地方, 点击

点击 “通过编码重新打开” (Reopen with encoding ),然后选择 GB 2312 改为国标码即可。

需要注意的是各个 编码 集不通用, 你中间出现中文将会出现乱码。但是换到初始代码,又会解码正常。这个时候不使用指定编码集也可以编译成功。 重新执行 javac Hello.java 发现编译通过。这里我们还是使用 utf-8 进行编写源代码, 重新恢复过来。学习技术的过程就是一个不断重复尝试, 不仅要写正确的代码, 也要能写错误的代码。这样你才能知道有些错误是怎么产生的, 怎么避免它。知道它能做, 也知道它不能做。

编译之后的文件为:

可以看到编译之后的 Hello.class 现在开始这个文件就是能够在 Java 虚拟机中使用了。暂时可以把 Java 虚拟机当作是一个翻译官。你不会英语, 你请了一个翻译官。 你说了你好, 翻译官给你翻译成 Hello。这样你不需要懂得英语也能给一个会英语的交流。你能与多少国家的人交流取决于翻译官会多少国家的语言。这也就是说你要想给一个会英语的交流没有翻译官你们就沟通不了。

第三步:运行 Java 应用程序

编译之后, 也就来到了我们运行程序的步骤。 如果运行呢? Java 里面使用 java 命令进行运行。

java 虚拟机只能运行 .class 文件, 也就是我们上面的 Hello.class

使用方法: java [选项] 主类名称

这里就是使用: java Hello ,效果如下图:

这里就可以看到我们运行之后的效果了。 第一个 Java 程序跑起来了。 虽然是很小的一个案例。但也很有成就感。

这里需要注意的是, 运行命令 中的类名是严格遵守区分大小写的规则。所以这里只能使用 Hello, 而不能使用 hello 或者其他的大小写不同的类名称。

错误信息如下所示:

以上只是最简单的使用方式, 接下来我们深入了解一下 javac 和 java 命令。

javac 和 java 命令

针对 javac 命令。 我们之前说过, 这个命令会有很多的选项可以配置。一般情况下 javac 和 java 相对出现。这里进行编译 -> 运行的方式进行各种参数举例。

上面我们演示过一个选项 -encoding 它的作用是指定源文件使用的 字符编码 ,也就是我们常说的 字符集

然后我们来看另外一个常用的参数 -d 指定生成类文件的位置。

我们现在规定 class 文件必须指定放到对应的生成目录 target/classes 中。这个时候我们就可以使用 -d 命令选项。 javac -d ./target/classes Hello.java 举例如下:

并使用命令 tree /f 查看当前的目录树 其中目录中的 “.” 代表着当前目录。

然后可以看到对应的目录结构

 target
    classes
        Hello.class  

这样我们指定了对应的 class 文件的目录。现在我们的代码还没有指定一个 package ,如果指定一个 package 之后加入 -d 除了生成指定路径之外,还会生成对应的 package 包名对应的目录。

这里只是了解,后续会单独针对 package 包进行单独讲解详细说明。循环渐进的学习, 更容易理解也更容易学习。

生成之后如何使用呢, 这里我们就要说一说另一个 环境变量 classpath

classpath

classpath 直接翻译出来, 就是 class path 类的路径,对于任何想在系统中直接使用的路径文件,都可以通过配置系统的环境变量进行全局直接使用。classpath 的作用就是告诉编译器 Java 生成的 .class 文件从哪里去找。

这里 javac 和 java 命令都包含对应的选项。代表的含义相同,都是查找 .class 文件, 但是在编译的时候,又有些许不同。下面的例子具体演示。

不同的 JDK 版本 classpath 稍有不同

在 Java 1.5 之前, 没有配置默认的 classpath 值。所以需要指定 classpath 的环境变量, 并且需要使用 “.” 来指定当前目录。

举个例子: classpath=.;%JAVA_HOME%lib

从当前类中查找 class 文件, 如果当前文件中没有就从 Java 的安装文件中的 lib 。%JAVA_HOME% 是 Java 的安装 JDK 的根目录。在 Windows 下使用分号 “;” 定义多个不同的目录, 在 *nux 体系下使用冒号 “:” 进行区分多个不同的目录。

删除当前目录中的 .class 文件, 当前目录效果图如下:

这个时候, 如果还使用 java Hello 进行执行代码就无法执行成功因为当前目录已经没有了 Hello.class 的字节码文件。

因为我们把 Java 的 .class 文件放入到了 target/classes 中。所以这个时候我们就可以使用 classpath 选项进行指定 classpath 的目录。语法代码如下:

 java -classpath target/classes Hello  

既然是路径, 当然也就有 相对路径 和绝对路径, 并且两种方式都可以使用。上面的使用相对路径的方式进行调试, 下面我们使用绝对路径进行调试:

 java -classpath C:Codejavajavase17-tutorialcodechapter02targetclasses Hello  

我们修改代码, 并新建一个文件 My.java 代码很简单,定义了一个方法,如果不理解的话, 下面的内容可以直接忽略,不用再往下看,先去了解基本的语法之后, 再返回来在进行学习,这种方式更加快速, 不容易零基础入门到放弃。

并修改 Hello.java 代码,修改成如下所示:

我们在学习的时候, 故意制造一些难度。先从简单的, 直接编译 Hello.java 。先删除 target 文件, 继续进行测试。

 javac -encoding utf-8 -d target/classes Hello.java  

查看目录树, 发现只编译了 Hello.java 源文件, 但是却把对应的 My.java 也进行了关联编译。这是因为在编译的时候, 没有指定 classpath 进行了全编译的过程。如果不想编译 My.java 可以指定 My.class 文件就可以了。

删除 target 。继续测试。编译 My.java 这里指定新的目录, 把这两个源码编译到不同的目录中。

 javac -encoding utf-8 -d target/classes1 My.java  

然后再次编译 Hello.java,这里我们需要使用 -classpath 选项指定 My.class 文件路径。

 javac -encoding utf-8 -d target/classes2 -classpath target/classes1 Hello.java  

指定之后, 可以查看 target/classes2 的目录中只有我们编译的 Hello.class 字节码文件。是我们想要的效果。

然后运行这个程序,因为这个在不同的目录, 就需要用到多个目录进行关联,当前环境是 Windows 所以使用分号:“;” 进行区分。

在 Windows 中, 当前命令行工具有3个大类。

  • cmd
  • Windows PowerShell
  • PowserShell

这 3 个不同的命令行在指定多个参数的时候有两种写法。 CMD: -classpath target/classes1;target/classes2 就可以了。 但是在 WIndows PowerShell 和 PowerShell 中, 我们需要把多个参数的情况下使用 双引号 进行引用,否则将会出现错误。

cmd 效果:

*PowerShell 效果:

你也可以尝试一下不加 引号 的错误效果, 这里不再给出。 可以自行尝试, 多尝试失败的情况。 也能帮你理清楚正确的思路。

如果只指定 Hello.class 所在目录, 就会出现错误。

实际开发中一般遇到这种情况, 一定是找不到对应的类文件导致的。

思考一下 Eclipse Idea 这些开发工具在进行运行代码的时候都是怎么运行的。 其实最终还都是这两个命令。

理解基础的运行结构会更有助于架构的实施。更能做出更好的架构体系。

本章的内容暂时告一段落了。 接下来将针对 Java 的基础语法结构进行详细讲解了。

关注我, 后续更多更加详细的内容持续更新中。

文章来源:智云一二三科技

文章标题:第一个 Java 应用程序

文章地址:https://www.zhihuclub.com/188087.shtml

关于作者: 智云科技

热门文章

网站地图