代码编织梦想

“Hello, world"程序是指在计算机屏幕上输出“Hello, world”这行字符串的计算机程序,“hello, world”的中文意思是“你好,世界。”。因为《The C Programming Language》中使用它做为第一个演示程序,非常著名,所以后来的程序员在学习编程或进行设备调试时延续了这一习惯。

Java 源程序

也称源代码,是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。

在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。

Hello World

首先,来看下使用 Java 语言编写 HelloWorld 源程序的全貌:


 public class HelloWorld {

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

}

在这段源程序的代码虽然非常少,但是我们能从中得到如下信息:

  1. public 修饰符用于限定类成员的访问级别
  2. class 关键字用于定义类,该类的标识符 是 HelloWorld
  3. 类标识符的命名一般采用 帕斯卡命名法
  4. HelloWorld 类被 public 修饰,应在名为 HelloWorld.java 的文件中声明
  5. 类标识符后紧跟一对大括号,类成员一般定义在这对大括号中,例如实例成员或者静态成员
  6. static 关键字用于声明静态成员,这里定义的是一个静态函数,标识符是 main
  7. 函数标识符的命名一般采用 驼峰命令法
  8. void 关键字用于定义无返回值函数
  9. main 函数是 Java 程序的主入口函数
  10. 函数标识符后紧跟一对小括号,形式参数一般定义在这对小括号中,这些形式参数在程序运行时可用于接受来自外部传入的实际参数
  11. String 关键字用于定义字符串类型变量
  12. String[] 用于定义字符串类型的数组,该数组的标识符是 args
  13. 该源程序中的 main 函数的函数签名是:public static void main(String[] args)
  14. 函数签名后紧跟一堆大括号,代码块一般定义在这对大括号中,大括号(包括大括号本身)内的所有代码的集合被称之为函数体
  15. 一个完整的函数成员是由函数签名和函数体组成
  16. System 是来自 java.lang 包下的一个类
  17. out 是 System 类中的一个静态成员,它是 java.io 包下 PrintStream 类的实例
  18. println 是 out 提供的一个实例成员,而且是函数成员
  19. 访问静态成员的语法是 类名.成员名,访问实例成员的语法是 实例名.成员名
  20. 在代码中调用一个函数时需要在该函数名后跟一对小括号,如果该函数需要传递参数,则将对应的实际参数按类型和顺序写到小括号中,并使用英文逗号隔开即可
  21. 定义字符串的字面量是直接将字符串写在双引号中,例如 "Hello World!"
  22. 分号代表一行或者一段代码的结束

作为初学者,对以上叙述的内容有部分可能不太理解,但不用着急,随着学习的深入,这些都会慢慢地被理解,我也会在后面的文章中详细阐述。

您在这段源程序中看到了哪些信息呢?在评论区留言给我吧!

编译 && 执行程序

在源程序所在目录下执行如下命令可对当前编写的源程序进行编译

javac HelloWorld.java

在编译结束后,会产生一个 .class 文件,这就是《搭建本地软件开发环境 》中提到的字节码文件,使用如下命令可将该字节码文件通过 JVM 解释给计算机并执行。

java HelloWorld

在 DOS 中,我们可以使用 && 将多个命令写到一条指令中,使其按顺序执行,关于这个我在《常用DOS命令 》一文中有提及。

cls && javac HelloWorld.java && java HelloWorld

当我们修改源程序中的字面量后,重新执行上述指令,会发现命令行打印了新的字面量信息。但如果字面量中包含中文的话,例如 "您好,世界!",就会乱七八糟的文字,这是因为 javac 指令在编译源程序的时候,默认的字符集不支持中文,我们需要为其指定支持中文的字符集,一般情况下,我们选择UTF-8字符集,修改编译指令如下:

javac -encoding UTF8 HelloWorld.java

拓展 HelloWorld

我们使用 java 指令执行 java 程序的时候,我们采用的指令是:java HelloWorld,我们在第二章节中搭建开发环境的时候说到过我们需要通过配置环境变量使得 java 指令能够在命令行中全局可用。这里的 java 指令实际上就是存在于 Window 操作系统磁盘上一个可执行的程序,也就是 JDK 中 bin 目录下的 java.exe,如图所示:

java指令的位置
到这里我们知道了,之前修改系统环境变量 Path 的值,将该目录加入其中的目的是为了系统能找到这个指令。这个道理就跟我们在某个目录下找到一个可执行程序,双击启动该程序的道理一样。

在指令 java HelloWorld 中,java 程序是系统来执行的,而 HelloWorld 则是系统在执行java 程序的时候我们传递给这个程序的参数。这就好比在第一章提到的 CD 指令一样,当我们给 CD 指令传递参数是 .. 的时候,系统在执行CD这个程序后,会将当前目录切换到上级目录;当我们给 CD 指令传递参数是 / 的时候,系统在执行CD这个程序后,会将当前目录切换到根目录 。话说回来,我们给 java 指令传递的参数是 HelloWorld,那 java 这个程序在执行过程中,会在当前目录和环境变量指定的 CLASSPATH 目录下查找 HelloWorld.class 文件,如果找到了该字节码文件,则通过 JVM 来解释并执行,如果依然找不到这个源程序,则会提示 错误: 找不到或无法加载主类 HelloWorld

注:关于 CLASSPATH 的详细说明请参考文末的 PATH 和 CLASSPATH 段落。

关于 JVM,百度百科上的描述是 —— 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。那这个虚构的计算机在解释并执行 java 字节码的时候,能像 DOS 那样传递参数吗?
JVM在百度百科上的解释
注:此图截自 2020年二月,仅作参考,因为百科上的内容可被编辑,故而,若您看到的说明不是此图上的内容,请以官方的为准。

DOS 在执行一个程序的时候,将程序名后面的文本看作是参数,那么,我们把 JVM 也看作是一个计算机操作系统的话,那大致可以这样理解:

java 指令在 DOS 和JVM 中的不同
换句话说,站在 DOS 的角度,传递了 HelloWorld 和 Hello 两个参数;而在 JVM 的角度,传递了Hello这一个参数。那既然我们传递了参数给 HelloWorld 程序,那 HelloWorld 程序如何接收到该参数,并作出相应的处理呢?

在上文中,我们看到 main 函数的形式参数 args 貌似都没有什么用处,实际上他就是为了接收外部传递的参数而存在的,关于形式参数的用法将会在后面分享函数的章节中详细为大家介绍。修改 HelloWorld.java 的代码如下:

public class HelloWorld {

	public static void main(String[] args) {
		System.out.println("您好,世界!");
		if(args == null || args.length < 1) {
			return;
		}
		for(int i = 0; i < args.length; i++) {
			System.out.println("得到第" + (i + 1) + "个形参的值:" + args[i]);
		}
	}

}

然后我们在 DOS 终端中输入如下指令:

cls && javac -encoding UTF8 HelloWorld.java && java HelloWorld Hello World

得到的结果如下图所示:

java 指令执行结果展示
在修改之后的源程序中,用到了后面章节才有的条件语句,循环结构等,如果初学者看不懂这部分,仅作了解即可。

PATH 和 CLASSPATH

PATH 是一个系统全局变量,其值表示的是该操作系统中可执行文件的搜索路径。使得在 DOS 中执行某个命令的时候不需要自己手动查找该命令所在的磁盘的具体位置。其值具体格式是:

<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

在上一个章节中,在 PATH 变量的值的后面增加了 %JAVA_HOME%\bin ,其目的是为了在 DOS 中执行 java 指令的时候,让系统能够到我们安装的 JDK 目录下进行查找。

所以,PATH 是 Windows 操作系统中可执行文件的搜索路径集合。
同理,CLASSPATH 是 JVM 可被解释并执行的字节码文件的搜索路径集合。

所以,当我们在 CLASSPATH 中配置了 HelloWorld 程序所在目录后,达到的效果是:即便 DOS 终端驻留的目录不是 HelloWorld 程序所在目录,也能通过 java HelloWorld 成功执行该程序。

JDK的内置库中包含了一些工具包,在 dt.jar 和 tools.jar 中,推荐的 CLASSPATH 配置是:
CLASSPATH 的配置
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/marvelousness/article/details/104530901

操作字符串有哪些?string和stringBuilder的效率对比-爱代码爱编程

操作字符串有哪些?string和stringBuilder 以及StringBuffer的效率对比? 答: 1.操作字符串:String,StringBuffer,StringBuilder 2.用字符串的拼接来看,stringBuilder可以直接拼接,而String类型如果要字符串拼接,每次都会生成一个新的String类型,在进行拼接,String拼接

【Zuul2】Zuul2网关介绍及案例(非spring集成)-爱代码爱编程

目录 一.使用缘由 二.项目介绍 1.核心内容 (1)三种过滤器 Inbound、Endpoint 、Outbound  (2)配置文件application.properties (3)动态配置application.properties 2.参考文档 一.使用缘由 公司需要在springcloudgateway和zuul2间做一次较为

粤嵌学习打卡第10天(多线程学习笔记二)-爱代码爱编程

本片博客给大家通过模拟卖票问题讲解线程安全问题 1、多个线程模拟卖票问题 public class SaleTicket extends Thread{ //非静态属性归每个对象所有,静态属性归所有对象所有 private static int ticket = 100; public void run() { while(ticket &g

Java经典面试题整理及答案详解(四)-爱代码爱编程

简介: Java经典面试题第四弹来啦!本节小编整理了关于Java开发框架常见的面试题,希望大家多多怜惜,一起进步~ 1.SpringMVC返回值,使用SpringMVC的时候我看到两种风格的开发,一种是控制层的方法返回值类型主要是ModelAndView(就如我们的BSM项目),另外一种风格是返回值Spring类型,在开发中要怎么取舍? 从简

通过异常处理错误(6):异常匹配、其他-爱代码爱编程

一、异常匹配     抛出异常的时候,异常处理系统会按照代码的书写顺序找出“最近”的处理程序。找到匹配的处理程序之后,它就认为异常将得到处理,然后就不再继续查找。     查找的时候并不要求抛出的异常同处理程序所声明的异常完全匹配。派生类的对象也可以匹配其基类的处理程序,就像这样: class Annoyance extends Exception

Java经典面试题整理及答案详解(五)-爱代码爱编程

Java经典面试题第五弹来啦!本节面试题主要是针对Java初级基础提问,看看你还记得多少? 1.String str=“hello”,这个字符串对象在栈内存中明明有一个引用(str[ox00010]),为什么还说这个字符串是匿名对象呢? 所谓的字符串是匿名对象,实际上是因为只要使用了“’’”声明,那么就表示将在堆内存空间里面开辟一个新的字符串

Linux 学习笔记分享 第一天-爱代码爱编程

我是一名机械自动化设备公司的售后技术员,经常接触各种人工智能,视觉光源,机器人研发的各种工程师,他们工资最低的么有低于10K的,这让我一个拥有房贷,车贷的90后的穷哈哈房奴很是羡慕,所以痛定思痛决定把王者荣耀卸载了!!好好学习与这些相关的东西技术,知识改变命运,知识就是力量,以后尽量每天都在此博客,每天更新一次的学习笔记,希望会遇到博客上的良师益友,一起进

代码整洁之道-爱代码爱编程

文章目录 一、谨慎命名二、函数和类1. 函数和类应该坚持 单一权责原则。保持高内聚,低耦合。隔离会让系统每个元素的理解变得容易。2.尽量不要在参数中传递状态值3. 同一个函数中的代码应该属于同一层级三. 注释最好的注释是 没有注释,若代码足够有表达力,用代码来展示意图往往会更好。四、数据结构五、错误处理 一、谨慎命名 给函数和变量取个好

经典例子理解 java回调机制(异步回调)-爱代码爱编程

经典例子理解 java回调机制(异步回调) 关于回调过程的简单描述:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。感觉还是有些绕,参考经典一点的过程描述: class A实现接口CallBack callback——背景1class A中包含一个class B的引用b ——背景2class B有一个参数为

Python基础架构-爱代码爱编程

盖房子的时候,木料的选择是个问题。 木匠的目标本质上就是携带好的切割工具。在他有时间的时候,会将他的设备磨得很锋利。 {–:}——宫本武藏(五轮书) 本文摘自《Python大数据分析(第2版)》第2章 对于Python新手来说,Python的部署似乎很简单。丰富的可选安装库和程序包也很容易安装。首先,Python不止一种,它有许多不同的

java基础学习一之java编程基础-爱代码爱编程

1.java的历史 重点:1995年Sun公司推出了java面向对象的程序设计语言,2009年sun公司被收购 2.java的特点 面向对象(用计算机模拟现实世界,解决现实问题)简单(相对于C,C++,C#,不易造成内存溢出,减少代码量,代码可读性高)跨平台(操作系统,服务器,数据库,需要依赖Java的虚拟机 JVM)注:编译就是将.java文件转换

来自一个大二学生自学Java一个月的感受,新人学习-爱代码爱编程

我,大二学生,一个期盼自己有一天成为黑客大佬的癞蛤蟆,而且还是金皮的。 癞蛤蟆的开始 因为自己从小对电脑有特别的兴趣,而且看了许多关于黑客的文字或视频资料,让自己一度想成为像剧情里的黑客一样,可以呼风唤雨。所以,在上了大学,选择了电脑相关专业,软件工程专业。 在大一期间,我混着度过这一年,学了C语言,学校的教学是带我们入门,而不会带我们深究,所以懵懂的