快捷搜索:  汽车  科技

c语言java从入门到精通(cqh-编写第一个java程序)

c语言java从入门到精通(cqh-编写第一个java程序)在 DOS 窗口中输入 javac Hello.java,得到如下结果。​图 2.1.1-1 最方便的一种方法​双击此文件,输入如下。还是直接复制、粘贴吧,记得保存。(Ctrl S)码 2.1.1-1 你好世界!​ public class Hello { public static void main(String[] args) { System.out.println("hello world!"); } }打开 DOS 窗口,使用 cd 命令切换到此文件的所在目录。[2]

2. 编写第一个程序

内容导视:

  • 编写源代码并运行
  • 代码书写规范
  • 注释
2.1 编写源代码并运行

内容导视:

  • 创建 .JAVA 文件编写源码
  • 配置环境变量
  • 解释代码含义
  • 编译与运行
2.1.1 创建 .java 文件编写源码

开始写源代码,但只是在 DOS 窗口中输出一句话而已...

创建以 .Java 结尾的文件,如 Hello.java。[1]

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

码 2.1.1-1 你好世界!​

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

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

​图 2.1.1-1 最方便的一种方法​

c语言java从入门到精通(cqh-编写第一个java程序)(1)

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

​码 2.1.1-2 不被识别的命令​

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

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

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

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

​图 2.1.1-2 执行 ipconfig 命令​

c语言java从入门到精通(cqh-编写第一个java程序)(2)

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

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

[1] “xxx.java” 中的 “java” 称为后缀或扩展名,打开文件资源管理器,查看,勾上文件扩展名和隐藏的项目。

文件右击选择打开一种打开方式,(EditPlus 或其他文本编辑器,找不到选择其它应用,然后选中 “始终使用此应用打开此类型的文件” 复选框)这样你以后双击 .java 文件就可以直接使用此软件打开啦。

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

[3] 如果桌面上没有此电脑图标:

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

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

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

​图 2.1.2-1 配置 path 变量​

c语言java从入门到精通(cqh-编写第一个java程序)(3)

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

​图 2.1.2-2 自定义变量 JAVA_HOME​

c语言java从入门到精通(cqh-编写第一个java程序)(4)

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

​图 2.1.2-3 替换之前的路径​

c语言java从入门到精通(cqh-编写第一个java程序)(5)

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

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

例:

​图 2.1.2-4 老版本显示的变量值​

c语言java从入门到精通(cqh-编写第一个java程序)(6)

检查自己是否配置好了:

​码 2.1.2-1 检查配置​

打开 DOS 窗口,输入 java -version 和 javac 等命令 如果显示版本信息,证明 java.exe 是可以用的 再输入 echo %Path% 查看刚刚配置的 JDK的家\bin 路径是否在其中

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

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

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

​图 2.1.2-5 其它的 java.exe​

c语言java从入门到精通(cqh-编写第一个java程序)(7)

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

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

​图 2.1.2-6 编译与运行​

c语言java从入门到精通(cqh-编写第一个java程序)(8)

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

新建环境变量 classpath:

​图 2.1.2-7 新建 classpath 变量​

c语言java从入门到精通(cqh-编写第一个java程序)(9)

“.” 是英文句号,代表当前路径,如果不写就不会从当前路径寻找 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 变量值里。

[1] javac Te*.java 会将文件名开头为 “Te” 的所有 “java” 文件都编译。

2.1.3 解释代码含义

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

​码 2.1.3-1 第一个程序​

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.4 编译与运行

编译与运行

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

编译:使用 javac 源文件名.java 命令编译生成后缀为 class 的文件(也称字节码文件)。

运行:使用 java class文件名 命令,生成了一个 JVM 实例,Java 程序运行在此实例上;JVM 实例通过调用此类型的 main 方法来运行一个 Java 程序,当程序退出时,JVM 实例随之消亡。

同时运行三个 Java 程序,会得到三个 JVM 实例,每个 Java 程序都运行在它自己的 JVM 实例中。

​图 2.1.4-1 编译与运行​

c语言java从入门到精通(cqh-编写第一个java程序)(10)

编译

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

一个源文件可以定义多个类型,如 class xxx、class xxx2、Enum xxx...、编译后生成多个 class 文件,每个 class 文件都对应着唯一的一个类型的定义信息。

​码 2.1.4-1 定义不同类型​

package com.cqh; class A {}// A 是类名 class A2 {}// A2 是类名 interface B {}// B 是接口名 @interface C {}// C 是注解名 enum D {}// D 是枚举类名 // 上述类型的名称称为简单名,如果再加上包名,如 com.cqh.A,称为全限定名或完整名

编译后生成 A.class、B.class、C.class、D.class 文件。

在程序运行过程中也可以动态生成某类型,所以 class 文件不一定只指存放在磁盘上的文件,而是代表某类型的二进制字节流,无论以何种形式存在。

运行

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

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

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

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

2.4 代码书写规范

内容导视:

  • 代码书写
  • 代码规范
  • 标识符与关键字
2.4.1 代码书写

看不懂没关系的,只挑能理解的。

1)字母严格区分大小写,如 class 不等于 Class。

2)任何有效的代码必须写在 “类体” 中,就是 public class Hello 后的一对大括号 {} 内。

3)大括号必须要成对写,防止漏掉。

4)为了增加代码的可读性,{} 里的内容需要使用 tab 缩进,如 main 方法就比 class Hello 低一个层次。

​码 2.4.1-1 低一层级,需要缩进​

class Hello { // 被 {} 包裹的部分选中,按下 tab public void some1() { // 被 {} 包裹的部分选中,按下 tab int i = 10; if (i > 10) { // 同理 System.out.println("为何"); } } }

5)main 方法后的 {} 包裹的内容称为方法体,由一行行的 java 语句构成,任何一条 java 语句必须以分号结尾。若无特别说明,默认为英文状态下的符号。

6)方法体中代码遵循自上而下的顺序依次逐行执行,不可随意颠倒顺序。

System.out.println(i);// 执行到这句时,还没有 i 变量 int i = 10;

7)一个 java 源文件可以定义多个类型。编译后,每一个类型对应一个 class 文件,如以下编译后会生成 A.class、B.class、C.class 三个字节码文件

class A {} class B {} class C {}

8)有 public 修饰的类可以没有,但如果有,被 public 修饰的类名必须与源文件名一致。 例:源文件名为 Hello,则 public class 后的类名也应该为 Hello。

9)被 public 修饰的类如果有,则最多只能有一个。

10)运行时,只会调用 main 方法(也称入口方法)里面的内容,入口方法有固定的书写格式:

public static void main(String[] args) {}

入口方法所在类称为入口类。

2.4.2 代码规范

规范与规则不一样,不是必须遵守。但是如果你不遵守,代码可读性会很差。反例如下,虽然可以通过编译,但你看起来感觉如何?

​码 2.4.2-1 毫无章法​

class Hello { public static void main (String a[]){ System. out. println( "你好" ) ; int i=2 ; if (i> 1&&i <29){ System.out.println("e"); } } }

1)类和方法上的注释,以 javadoc 的方式,方便生成文档注释。

​码 2.4.2-2 文档注释​

class Test { /** * 这个注释下节有讲,现在只是测试 */ public void some() {} }

2)非 javadoc 注释,用于给代码的维护者和读者看。(为什么这么写,如何修改,注意事项)

​码 2.4.2-3 单行注释​

// 这就是注释,解释下面是将 10 赋给了 int 类型的变量 i; int i = 10;

3)运算符如 <、= 的两边使用空格与字符隔开,举出正反例:

int a = 10; int b=10; if (a < 20 && b > 5) {} if(a<20&&b>5){}

4)代码编写使用次行风格或行尾风格。

​码 2.4.2-4 行尾风格​

// 行尾风格 public void add(int num) { if (num < 0) { this.age = 3; } else if (num < 6) { this.age = 33; } else { this.age = 333; } }

​码 2.4.2-5 次行风格​

// 次行风格 public void add(int num) { if (num < 0) { this.age = 3; } else if (num < 6) { this.age = 33; } else { this.age = 333; } }2.4.3 标识符与关键字

声明:由于每次使用 import、带上完整类、main 方法比较繁琐。于是进行了简化,只提供关键部分,外面的类、方法等其它代码以后自己加吧,别直接复制代码,发现怎么跑不起来啊?

class Hello { public static void main(String[] args) {} public int add(int num1 int num2) {} }

凡是程序员有权利命名的单词都是标识符。

比如:类名、方法名、参数名、变量名、接口名、常量名。(这些是什么,以后就知道了,现在只是看看)

// add 是方法名有权利命名 public int add(int num1 int num2){ // n 是变量名 int n = num1; }

你可以试试哪里可以修改,比如修改 public、int 等单词,是否会报错。你就明白,你可以动的地方有哪些。可以动而不报错的那些单词就是标识符,不可以动的就是关键字。

标识符命名规则

  • 标识符只能由数字、字母、_、$ 组成。(标识符中不能有空格)
  • 标识符不能以数字开头。
  • 关键字和保留字不能做标识符。
  • 标识符严格区分大小写(如 Public 与 public 不一样),占用字节数不得超过 64 KB。

可以使用 java.lang.Character 类的方法检验,isJavaIdentifierStart 方法可以确定某字符是否可以作为变量名的开头;

isJavaIdentifierPart 方法确定某字符是否可以作为变量名的一部分,不包括开头。

标识符命名规范

一、见名知意,如 day 代表天数。

1)别用拼音与英语混合,那样很难理解。

反例:tianKongBlue

2)杜绝完全不规范的英文缩写,避免望文不知义。

反例:AbstractClass “缩写”成 AbsClass; condition “缩写”成 condi; Function “缩写”成 Fu; 此类随意缩写严重降低了代码的可阅读性。

二、驼峰命名,多个单词连在一起时,单词首字母大写,增加识别和可读性,下面是阿里巴巴开发手册(黄山版)详细:

1)类名使用 UpperCamelCase 风格(首字母大写,后面每个单词首字母大写),以下情形例外:DO / PO / DTO / BO / VO / UID 等。

正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion 反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

2)方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格(首字母小写,后面每个单词首字母大写)。

正例:localValue / getHttpMessage() / inputUserId

3)常量名全部大写,单词间用_连接,力求语义表达完整,不要嫌名字长。

正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME 反例:MAX_COUNT / EXPIRED_TIME

枚举成员实际上也是常量,名称需要全大写,单词间用_连接。

4)抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾;枚举类名带上 Enum 后缀。

5)如果是形容能力的接口名称,取对应的形容词为接口名(通常是 –able 结尾的形容词)。

正例:AbstractTranslator 实现 Translatable 接口。

6)在常量与变量命名时,表示类型的名词放在词尾,以提升辨识度。

正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT 反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD

7)POJO 类中定义的布尔类型的变量,不要加 is 前缀,否则部分框架解析会引起序列化错误。

备注:POJO(Plain Ordinary Java Object):普通的 Java 对象。

反例:定义为基本数据类型 boolean isDeleted 的属性,它的方法也是 isDeleted()。 框架在反向解析时,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

8)包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

正例:应用工具类包名为 com.alibaba.ei.kunlun.aap.util;类名为 MessageUtils (此规则参考 Spring 的框架结构)。

9)避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名,使可理解性降低。

// 反例 public class ConfusingName { protected int stock; protected String alibaba; // 非 setter/getter 的参数名称,不允许与本类成员变量同名 public void access(String alibaba) { if (condition) { final int money = 666; // ... }for (int i = 0; i < 10; i ) { // 在同一方法体中,不允许与其它代码块中的 money 命名相同 final int money = 15978; // ... } } } class Son extends ConfusingName { // 不允许与父类的成员变量名称相同 private int stock; }

说明:子类、父类成员变量名相同,即使是 public 也是能够通过编译,而局部变量在同一方法内的不同代码块中同名也是合法的,但是要避免使用。对于非 setter / getter 的参数名称也要避免与成员变量名称相同。

关键字

Java 关键字是对 Java 编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息。

关键字一律用小写字母标识,按其用途划分为如下几组。

1)用于数据类型的关键字有:

boolean、byte、char、 double、 false、float、int、long、new、short、true、void、instanceof。

2)用于语句的关键字有:

break、case、 catch、 continue、 default 、do、else、 for、 if、return、switch、try、while、finally、 throw、this、 super。

3)用于修饰的关键字有:

abstract、final、native、private、protected、public、static、synchronized、transient、volatile。

4)用于方法、类、接口、包和异常的关键字有:

class、 extends、 implements、interface、 package、import、throws。

5)保留字:

cat、 future、 generic、inner、 operator、 outer、rest、var、goto、byValue、cast、const 等都是 Java 尚未使用,但以后可能会作为关键字使用。

true、false 是布尔字面量,null 是空字面量。但它们和关键字一样,不可以作为标识符使用。

2.5 注释

内容导视:

  • 单行注释
  • 多行注释
  • 文档注释
  • IDEA 工具自动快捷键添加注释
  • 使用 javac 命令编译时出现的"错误: 编码 GBK 的不可映射字符"
  • 查看系统编码
  • 使用 API 文档

注释是对代码的解释说明,方便理解代码的含义,提高代码的可读性。 注释不是编程语句,因此被编译器忽略。 如果不写注释,时间久了或代码过长本人也看不懂,所以编写注释是一个良好的习惯。

注释有三种,依次介绍。

2.5.1 单行注释

使用双斜杠 //,// 后的就是注释(仅一行),不会被编译器当成 java 语句。

​码 2.5.1-1 单行注释​

public class A { public static void main(String[] args) { // 输出一句话到控制台 System.out.println("Hello World A"); } }2.5.2 多行注释

对于很多内容,单行放不下,可以使用多行注释,在 /**/ 内写下内容,星号别省略。

​码 2.5.2-1 多行注释​

/* System 是类, 通过类名.调用 out 这个静态变量, 这个静态变量保存的是堆内存中的对象地址,被称为对象引用 再通过对象引用,调用对象的 println 方法 */ System.out.println("Hello World A");2.5.3 文档注释

下面看看就行,以后使用开发工具 IDE 自动生成,没必要手动敲。

文档注释可以被 javadoc 命令解析,生成以网页形式(html)显示的 API 文档。(Application Programming Interface:应用程序编程接口)。

当类又多又杂,一个个找类、看注释很麻烦,于是提取出来生成网页。

用来说明类、成员变量和方法的功能。不用在一个一个 java 文件中查看注释,直接打开 html 查看想要的方法。

javadoc 默认只提取 public、protected 修饰的部分,javadoc -help 查看可加的选项。

文档注释必须写在类、接口、方法、构造器、成员字段前面,写在其他位置无效。

文档注释中可以识别的标签如下:

​表 2.5.3-1 标签​

标签

说明

@version

指定类的版本,用于类上

@author

标注类的作者

@since

从哪个版本起有了这个方法

@param

参数详细信息

@return

说明返回值

@throws

可能抛出的异常

@deprecated

表示废弃,不建议使用,JDK5 时被注解 @Deprecated 取代

@see

另请参阅,引用其他类的文档

文档注释的标签区分大小写,别写错了,也可以看看源码上的注释是怎么写的。(别省略 * 号,注意观察下面的格式)

​码 2.5.3-1 文档注释​

/** * @author 是在座的每一个人 * @version 0.0.1 */ public class Hello { /** * 这个方法用来求两数之和 * * @param num1 第一个参数 * @param num2 第二个参数 * @return 返回两个数的和 * @throws RuntimeException 测试用而抛出的异常 * @since 0.0.1 */ public int add(int num1 int num2) throws RuntimeException { return num1 num2; } }

javadoc 命令只能提取文档注释

​图 2.5.3-1 javadoc 命令提取文档注释​

c语言java从入门到精通(cqh-编写第一个java程序)(11)

javadoc Hello.java -encoding UTF-8 -version -author -private -charset UTF-8 -docencoding GBK

当前目录会生成 index.html 文件,双击此文件,交给浏览器解析(会自动打开浏览器),右键查看页面源代码,API 文档里的信息是读取 Hello.java 文件得来的。

使用此命令还可以追加其他 java 源文件的文档注释,例:javadoc -encoding UTF-8 Hello.java H.java

​图 2.5.3-2 javadoc 命令提取文档注释​

c语言java从入门到精通(cqh-编写第一个java程序)(12)

javadoc 命令中的参数说明

-encoding 是告知 java 源代码所用的字符编码;

-version、-author 是显示版本和作者;

-private 是显示所有类和成员;(包括显示私有,一般显示 protected 以上级别就行,可以不加此选项)

-charset 是告知浏览器此文件采用什么编码方式读取这个文件; 即 html 文件生成 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

-docencoding 是指定生成的 html 文件的字符编码,不写此选项,默认 UTF-8。


由于文件被保存时的编码和读取时采用的编码不一致会出现乱码,所以别掉坑。

指定文档生成的位置

使用 -d 指定文件在 E:\a\b\c 下生成。

javadoc Hello.java -d E:\a\b\c -version -author

代码一改,注释说明也得跟着改;为了避免无用功,代码中给标识符命名,见名知意,最好让所有人看到这段代码就知道它是干什么的,避免冗余无效注释。

示例如下:

​码 2.5.3-1 文档注释示例​

import java.nio.channels.ReadableByteChannel; import java.nio.charset.CharsetDecoder; /** * 这是测试如何制作 API 文档的类 * * <p> p 标签包围的文字代表一段,ul 和 li 标签是无序列表</p> * <ul> * <li>呵呵 {@code test} 呵呵</li> * <li>呵呵 <code>test</code> 呵呵</li> * <li>被上面 code 标签包裹的内容会更显眼,更细,一般用于标识符</li> * <li>see 标签另请参阅,格式:引用类的全类名#方法名(形参类型 形参类型...) * java.lang 包下的类可以省略包名。如果引用的类在 API 文档上,点击后会自动跳转 * 这个 H 类我也打包到了此文档</li> * </ul> * * @author cqh * @author 作者甲 * @version 1.0.0 * @see Object#wait(long) * @see Object#toString() * @see StringBuffer * @see H#hh() * @since 0.8.0 */ public class Test { /** * 介绍属性的作用 * * @see java.util.Scanner#makeReadable(ReadableByteChannel CharsetDecoder) * @since 0.8.1 */ public String[] name; /** * 说明方法的作用 * * @param name 这个name是 {@code String} 类型 * see参阅本类中其它方法省略类名。link如 * {@link #getAge(int int)}也可以跳转 例 * {@link H#hh()},{@link H} * @return 返回一个人名 * @throws ArrayIndexOutOfBoundsException 下标越界抛出此异常 * @see #getAge(int int) * @see H * @since 0.8.1 */ public String getName(String name) throws ArrayIndexOutOfBoundsException{ return name; } /** * 另一种格式 把解释放到下一行 {@link java.lang.Object#notify()} 你好 * * @param age * 这是人的年龄 * * @param count * 总个数 * * @throws IndexOutOfBoundsException * 如果满足如下几种条件之一就抛出该异常 * <ul> * <li> {@code age} 不是整数 * <li> {@code age} 没有填入 * <li> {@code age (end-begin)} 超过了 * {@code name.length} * </ul> */ public void getAge(int age int count) throws IndexOutOfBoundsException{} }2.5.4 IDEA 工具自动快捷键添加注释

以后有了 IDEA 工具再试,现在不用看,直接跳过;放心 IDEA 工具中会更详细地说明。

在 IDEA 中每创建一个类时,自动在类上加注释

左上角 File/Settings/Editor/File and Code Templates,includes/File Header

里面粘贴:

/** * 现在北京时间:${YEAR}/${MONTH}/${DAY} ${TIME} * 本类用于某某某 * * @author 作者 * @version 版本 * @see 另请参阅 * @since 从哪个版本有的 */

点击 apply 和 OK。

​图 2.5.4-1 文件头自动添加注释​

c语言java从入门到精通(cqh-编写第一个java程序)(13)

在方法上加注释

左上角 File/Settings/Editor/Live Templates

点击加号 Template Group 自己创建个组后,再选择你刚刚创建的组点击加号 Live Template。

解释:

Abbreviation:** Description:解释快捷键的描述,自己填写 Options Expand with Enter Template text: ** * * @param $param$ * @return * @throws */

当输入 Abbreviation 所写内容 ** 时,按下 Enter 就把 ** 转成 Template text 中的内容。

被 $$ 包围的变量需要点击 Edit vaiables 设置。

​图 2.5.4-2 自定义变量​

c语言java从入门到精通(cqh-编写第一个java程序)(14)

选择 Define 勾选 Java,就可以定义此模板只有在编写 java 文件才能使用。

​图 2.5.4-3 设置应用范围​

c语言java从入门到精通(cqh-编写第一个java程序)(15)

点击 apply 和 OK。

示例:

缩写词:psvt;设置好后 OK 返回。

c语言java从入门到精通(cqh-编写第一个java程序)(16)

在 java 文件输入 psvt 后按下 Tab 键,光标停在 $VAR$ 等我们输入;按下回车,光标到了 $END$ 处。

c语言java从入门到精通(cqh-编写第一个java程序)(17)

c语言java从入门到精通(cqh-编写第一个java程序)(18)

2.5.5 使用 javac 命令编译时出现的"错误: 编码 GBK 的不可映射字符"

内容如下:

  • 解决 GBK 乱码问题
  • 普及编码格式知识

本节片段提取:

友情提示,先复制文本,转换后直接粘贴。目的是避免转换编码后造成中文乱码,又得一个个改。

有 2 种方式解决:

1)文件/另存为副本,更改编码为 ANSI。(如果使用的是 notepad ,就在上方的工具栏的编码,转成 ANSI 编码)

​图 2.5.5-1 使用 ANSI 编码​

c语言java从入门到精通(cqh-编写第一个java程序)(19)

2)编译时指定 java 文件使用的编码格式。(编码格式在文本编辑器的右下方)-encoding UTF-8 是指定文件编码格式是 UTF-8。

​图 2.5.5-2 查看当前编码​

c语言java从入门到精通(cqh-编写第一个java程序)(20)

正文如下:

可能编译时由于代码(包括注释里面)中有中文,编译时说什么含有 GBK 的不可映射字符,不让通过。

​图 2.5.5-3 GBK 的不可映射字符​

c语言java从入门到精通(cqh-编写第一个java程序)(21)

为何报错

计算机只认得二进制数,也就是 0 和 1,存储和读取数据时都要使用二进制数表示。

0 和 1 可以有很多的组合,如 011、1001010 等等。可以用它们表示不同的数据,字符编码就是人为定义的一套转换表,规定一系列文字与二进制的映射关系。

有多种字符编码,比如 ASCII 码,一般是 8 位二进制表示一个字符,如字符 'a' 对应 01100001,这个二进制码转为十进制是 96;

学过概率的知道,8 位数,每位是 0 或 1,最多可以表示 2 ^ 8 = 256 个字符,应对 26 个英文字母绰绰有余。这 8 位称为 1 个字节(byte),每位称为 bit。

2 ^ 8 即 2 的 8 次方,只是为了方便表达。有的网站不支持上标、下标语法时,你会看到 2^8^、2~8~,分别对应 28、28。

ASCII 是美国人定义的,没有考虑其它国家。但我们国家用的不是英文,有很多字符是 ASCII 码没有的,1个字节也表示不了那么多的汉字,于是国人粗略规定了 GB2312,使用 2 个字节(16位)表示一个汉字。

如在 GB2312 编码中 "中国" 对应的二进制数 11010110 11010000 10111001 11111010,要是系统采用 ASCII 码读取这段二进制,由于它们定义的字符的映射关系都不一样,ASCII 编码也不可能有中文对应的二进制码,所以解码不可能正确,解析不出来就会乱码。

这里二进制数每 8 位隔开,只是方便观看。

来,我们使用记事本试试看。此处文件编码为 ANSI,使用 ANSI 编码读取文件,没有乱码,显示 “天下”。

ANSI 代表系统默认编码方式,在中国是 GBK,GBK 兼容 GB2312,使用 GBK 可以解析 GB2312。

举个例子,如果 ASCII 中所有字符对应的二进制码,在 GBK 中,对应关系也同样如此,就说明 GBK 兼容 ASCII 码。说人话就是 01100001 在 ASCII 中表示 'a',在 GBK 中也表示 'a'。那么使用 GBK 编码读取 ASCII 文件没有问题,反过来则不一定,因为 GBK 还多了 ASCII 中没有的汉字。

​图 2.5.5-4 ANSI 编码的字符​

c语言java从入门到精通(cqh-编写第一个java程序)(22)

让我们把文件编码转成 ISO-8859-1,也使用此编码读取文件。

​图 2.5.5-5 转为 ISO-8859-1 编码​

c语言java从入门到精通(cqh-编写第一个java程序)(23)

​图 2.5.5-6 乱码​

c语言java从入门到精通(cqh-编写第一个java程序)(24)

现在再看看,这不就乱码了吗?

所以解码和编码都要使用同一套字符编码规则,notapad 可以使用不同的编码方式解析,可以测试哪些编码是兼容的,不会乱码。

编码:字符 -> 二进制码

解码:二进制码 -> 字符

底层存储的实际是二进制码。

使用 javac 命令编译时,如果不指定 -encoding 选项,一般默认采用操作系统的字符编码方式,我的是 GBK。

在编写代码时,文本编辑器的右下角会显示当前文件的编码格式。编译时,若与系统当前编码不一致,不是同一套字符编码规则,解析不出来,就会报错。

多种方式解决

  • 告知此文件的编码方式。 例:当前文件的编码格式是 UTF-8,文件是 Hello.java,编译时添加 -encoding 参数指定文件编码 javac Hello.java -encoding UTF-8
  • 修改文件编码方式为 ANSI,文件另存时可以看到编码。(notepad 在工具栏/编码/转为...记得先全选复制,改编码后再粘贴,否则乱码没法撤回)
  • 所有文件使用统一的编码方式,如 UTF-8,新建环境变量 JAVA_TOOL_OPTIONS,值为 -Dfile.encoding=UTF-8,不建议,以后使用 IDE 工具统一使用 UTF-8 编码,不需要自己在外面配。
2.5.6 查看系统编码

通过 java 代码查看

​码 2.5.6-1 查看系统默认编码​

public class Hello { public static void main(String[] args) { String encoding = System.getProperty("file.encoding"); System.out.println(encoding); } }

c语言java从入门到精通(cqh-编写第一个java程序)(25)

通过 DOS 窗口查看

打开 DOS 窗口(Windows R,输入 cmd 回车),点击 DOS 窗口左上角图标/属性

​图 2.5.6-1 当前代码页 936​

c语言java从入门到精通(cqh-编写第一个java程序)(26)

当前代码页是 936,对应简体中文编码 GBK。

代码页是字符集编码的别名,也称内码表,下面是代码页与编码的对应关系:

​表 2.5.6-1 代码页与编码的对应关系​

代码页 国家(地区)或语言 437 美国 708 阿拉伯文(ASMO 708) 720 阿拉伯文(DOS) 850 多语言(拉丁文 I) 852 中欧(DOS) - 斯拉夫语(拉丁文 II) 855 西里尔文(俄语) 857 土耳其语 860 葡萄牙语 861 冰岛语 862 希伯来文(DOS) 863 加拿大 - 法语 865 日耳曼语 866 俄语 - 西里尔文(DOS) 869 现代希腊语 874 泰文(Windows) 932 日文(Shift-JIS) 936 中国 - 简体中文(GB2312)现在是 GBK 了, GBK 是在国家标准 GB2312 基础上扩容后兼容 GB2312 的标准。 949 韩文 950 繁体中文(Big5) 1200 Unicode 1201 Unicode (Big-Endian) 1250 中欧(Windows) 1251 西里尔文(Windows) 1252 西欧(Windows) 1253 希腊文(Windows) 1254 土耳其文(Windows) 1255 希伯来文(Windows) 1256 阿拉伯文(Windows) 1257 波罗的海文(Windows) 1258 越南文(Windows) 20866 西里尔文(KOI8-R) 21866 西里尔文(KOI8-U) 28592 中欧(ISO) 28593 拉丁文 3 (ISO) 28594 波罗的海文(ISO) 28595 西里尔文(ISO) 28596 阿拉伯文(ISO) 28597 希腊文(ISO) 28598 希伯来文(ISO-Visual) 38598 希伯来文(ISO-Logical) 50000 用户定义的 50001 自动选择 50220 日文(JIS) 50221 日文(JIS-允许一个字节的片假名) 50222 日文(JIS-允许一个字节的片假名 - SO/SI) 50225 韩文(ISO) 50932 日文(自动选择) 50949 韩文(自动选择) 51932 日文(EUC) 51949 韩文(EUC) 52936 简体中文(HZ) 65000 Unicode(UTF-7) 65001 Unicode(UTF-8)

也可通过 DOS 命令查看当前编码:chcp。

修改当前 DOS 窗口的编码:chcp 对应编码的代码页,如 chcp 936,当控制台不支持中文时,可以试试。(重新打开 DOS 窗口时会失效,恢复原来默认编码)

修改系统编码

如果是 Windows10,打开设置(Windows i),时间和语言/语言/管理语言设置/更改系统区域设置,

老版本的使用控制面板/时钟和区域/区域/管理/更改系统区域设置。

​图 2.5.6-2 更改语言​

c语言java从入门到精通(cqh-编写第一个java程序)(27)

下面还有 beta 版(即测试版),使用 UTF-8 编码提供全球语言支持;但有些地方会莫名其妙的乱码,不建议尝试,还是 GBK 靠谱。

参考文献

  • https://blog.csdn.net/gulang03/article/details/81771343
2.5.7 使用 API 文档

解决了中文乱码后,来看看 rt.jar 包中的类、方法、字段上的文档注释生成的 API 文档。

JDK17 API 文档:https://docs.oracle.com/en/java/javase/17/docs/api/index.html

JDK8 API 文档:https://docs.oracle.com/javase/8/docs/api/

JDK8 API 中文文档:https://www.matools.com/api/java8

记不住方法名怎么办,翻阅 API 文档查看方法的作用,你得首先记住哪个类好像有这个方法。

Java 语言提供了大量可供使用的基础类,Oracle 为这些类提供了对应的 API 文档,告诉开发者如何使用此类,以及方法。

通过包名 -> 类名 -> 方法这样的方式寻找。

以 JDK8 为例,如果不知道类在哪个包下,点击最上方的索引(INDEX)

如我要用 Math 类的求绝对值的方法,如果事先知道它在 java.lang 下(第一横线处下翻),找到后点击 java.lang,继续下翻(第二个横线处);找到后点击 Math,再看右边的页面,下翻;点击 abs 方法,就可以看到此方法的详细说明。

​图 2.5.7-1 使用 API 文档查找方法详细说明​

c语言java从入门到精通(cqh-编写第一个java程序)(28)

c语言java从入门到精通(cqh-编写第一个java程序)(29)

打开 rt.jar(jre 的 lib 下) 也可以看到 Math.class。

​图 2.5.7-2 查看源码上的注释​

c语言java从入门到精通(cqh-编写第一个java程序)(30)

c语言java从入门到精通(cqh-编写第一个java程序)(31)

c语言java从入门到精通(cqh-编写第一个java程序)(32)

你说这是字节码文件,根本看不懂,要看源码上的文档注释。好吧,在 JDK 安装目录下,打开 src.zip\java\lang\Math.java。

c语言java从入门到精通(cqh-编写第一个java程序)(33)

c语言java从入门到精通(cqh-编写第一个java程序)(34)

以这种方式,的确没有 API 文档访问方便不是吗?(养成在方法上写文档注释的好习惯,这样方便提取出来)

下面是谷歌翻译:

返回 {@code float} 值的绝对值。 * 如果参数不是负数,则返回参数。 * 如果参数是否定的,则返回参数的否定。 * 特别案例: * <ul><li>如果参数是正零或负零,则 * 结果为正零。 * <li>如果参数为无穷大,则结果为正无穷大。 * <li>如果参数为 NaN,则结果为 NaN。</ul> * 换句话说,结果与表达式的值相同: * <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))} * * @param a 要确定其绝对值的参数 * @return 参数的绝对值。2.x 总结回顾

程序员可以命名的单词是标识符,如类名、方法名、变量名、接口名、常量名。

命名规则

  • 只能由数字、字母、_、$组成。
  • 不能以数字开头。
  • 不能以关键字作为标识符。

命名规范

  • 类名、接口名首字母大写,之后每个单词首字母大写。StringBuffer
  • 方法名、变量名首字母小写,之后每个单词首字母大写。getName
  • 常量名全部大写,不同单词之间使用 “_” 隔开。ALL_MODES
2.y 课后习题

2.1 为什么 Java 代码可以做到一次编译,到处运行?

2.2 一个源文件可以生成多个 class 文件吗?

2.3 Java 源文件定义的类名必须与文件名一致吗?

2.z 习题答案

2.1 为什么 Java 代码可以做到一次编译,到处运行?

编译生成的 .class 文件与具体平台、系统无关。

JVM 虚拟机是关键。程序运行时,由 JVM 负责解释执行 .class 文件,将其翻译成不同平台下的机器码并运行。需要注意的是,.class 文件是与操作系统平台无关的中间代码,不能直接运行。

JVM 不跨平台,不同平台需要安装不同的 JVM。

这么做的目的,在可移植的同时兼顾执行效率。此外还加入了 JIT(just in time)编译器,把运行频繁的代码直接编译成与本地平台相关的机器码,需要时直接使用,不用再次翻译。


2.2 一个源文件可以生成多个 class 文件吗?

可以,源文件只要按规则定义了多个类,编译后会生成多个对应的 class 文件。


2.3 Java 源文件定义的类名必须与文件名一致吗?

不是,只有被 public 修饰的类名必须与源文件名一致。

猜您喜欢: