第3章 Java的基本程序设计结构
3.1 一个简单的Java应用程序
public class FirstSample {
public static void main(String[] args) {
System.out.prinln("Hello, world!");
}
}
- Java区分大小写。
- Java应用程序中的全部内容都必须放置在类中。
- 类名是以大写字母开头的名词,使用驼峰命名法。
- 源文件的文件名必须与公共类的名字相同,并用.java作为扩展名。
main方法必须声明为public,且是静态的(static)。- 如果希望main方法在终止程序时返回其他的代码,那就需要调用
System.exit方法。
3.2 注释
在Java中,有三种标记注释的方法:
///* *//** */
3.3 数据类型
在Java中,一共有8种基本类型,包括4整数型、2中浮点型、1中字符类型和1中布尔类型。
| 类型 | 存储需求 | 取值范围 |
|---|---|---|
int |
4字节 | -2147483648 ~ 2147483647 (正好超过20亿) |
short |
2字节 | -32768 ~ 32767 |
long |
8字节 | -9223372036854775808 ~ 9223372036854775807L |
byte |
1字节 | -128 ~ 127 |
float |
4字节 | 大约 ±3.40282347E+38F(有效位数为6~7位) |
double |
8字节 | 大约 ±1.79769313486231570E+308(有效位数15位) |
char |
2字节 | |
boolean |
1bit |
- 长整型数值有一个后缀L或l。
- 0x表示十六进制,0表示八进制,0b表示二进制。
- 可以位数字字面量加下画线,如
1_0000_0000。 - Java没有无符号类型的整型。
float类型的数值有一个后缀F或f。- 浮点数值不适用于无法接受舍入误差的金融计算中,因为浮点数值采用二进制系统表示,无法精确地表示分数1/10。如果不允许有任何舍入误差,就应该使用
BigDecimal类。 - 在Java中,
char类型描述了UTF-16编码中地一个代码单元。 - 整数值和布尔值之间不能进行相互转换。
3.4 变量
- 可以使用
Character类的isJavaIdentifierStart和isJavaIdentifierPart方法来检验哪些Unicode字符属于Java中的“字母”。 - 声明变量后,必须使用赋值语句对变量进行显示初始化,使用未初始化的变量会报错。
- 在Java中可以将声明放在代码中的任何地方。一般变量的声明应尽可能地靠近变量第一次使用的地方。
- C/C++中区分变量的声明与定义,Java中不区分变量的声明与定义。
- Java中,利用关键字
final指示常量。习惯上,常量名使用全大写。 - 可以使用关键字
static final设置一个类常量,这个常量可以在该类的多个方法中使用。类常量的定义位于main方法的外部。如果同时声明为public,那么其他类的方法也可以使用这个方法。
3.5 运算符
-
当参与
/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点数除法。 -
整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果。
-
使用
strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。 -
Math类包含多种数学函数:运算操作 方法 求平方根 sqrt求整数余数 floorMod三角函数 sin、cos、tan、atan、atan2常量 PI、E -
数据类型之间的转换:
![数据类型之间的合法转换]()
-
图中,实心箭头表示无信息丢失的转换,虚箭头表示可能有精度损失的转换。
两个数值进行二元操作时:
-
如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。
-
否则, 如果其中一个操作数是 float 类型, 另一个操作数将会转换为 float 类型。
-
否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。
-
否则, 两个操作数都将被转换为 int 类型。
-
-
强制类型转换:
double x = 9.9997; int nx = (int) x;对浮点数进行舍入运算,需要使用
Math.round方法:double x = 9.997; int nx = (int) Math.round(x);此时仍使用强制类型转换,是因为
round方法返回的值为long类型。 -
不要在
boolean类型与任何数值类型之间进行强制类型转换。如果确要转换,可以使用条件表达式b?1:0。 -
>>是算数移位(扩展符号位),>>>是逻辑移位(填充0),不存在<<<运算符。 -
Java中不适用逗号运算符。不过可以在for语句的第1部分和第3部分中使用逗号分隔表达式列表。
3.6 字符串
Java没有内置的字符串类型,而是在标准类库中提供了一个预定义类String。
3.7 输入与输出
-
要想通过控制台进行输入,首先需要构造一个与“标准输入流”
System.in关联的Scanner对象。Scanner in = new Scanner(System.in);之后可以使用
nextLine、next、nextInt、nextDouble等方法读取输入数据。Scanner类定义在java.util包中,使用时必须用import指令导入。 -
格式化输出使用
System.out.printf()。 -
要想读取一个文件,需要构造一个
Scanner对象:Scanner in = new Scanner(Path.of("C:\\mydir\\myfile.txt"), StandardCharsets.UTF_8);要想写入文件,就需要构造一个
PrintWriter对象,如果文件不存在,则创建该文件。PrintWriter out = new PrintWriter(Path.of("C:\\mydir\\myfile.txt"), StandardCharsets.UTF_8);如果用一个不存在的文件构造一个
Scanner,或者用一个无法创建的文件名构造一个PrintWriter,编译器会报出异常,并且认为这些异常比“被零除”异常更严重。 -
获取IDE中的程序启动目录:
String dir = System.getProperty("user.dir");
3.8 控制流程
-
Java中没有goto语句,但break语句可以带标签,可以利用它从内层循环挑出。标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。使用
break语句的代码,需要检测循环是正常结束,还是由break跳出。 -
for语句的3个部分应该对同一个计数器变量进行初始化、检测和更新。
3.9 大数
java.math包中的两个类BigInteger和BigDecimal,可以处理包含任意长度数字序列的数值。
3.10 数组
-
声明数组
int[] a = new int[100]; // 数组长度可以是变量 int[] smallPrimes = {2, 3, 5, 7, 11, 13, }; // 最后一个值后面允许有逗号,方便继续添加 smallPrimes = new int[] {17, 19, 23, 29, 31, 37, }; // 使用匿名数组重新初始化一个数组而无须创建新变量 int[] a = new int[0]; // java中允许长度为0的数组 int[] b = new int {};如果经常扩展数组的大小,应该使用数组列表(array list)。
-
创建一个数字数组时,所有元素都初始化为0。
boolean数组的元素会初始化为false。对象数组的元素会初始化为一个特殊值null。 -
越界访问数组会引发
array index out of bounds异常。 -
for each循环:for (int element : a) System.out.println(element); -
可以利用
Arrays类的toString方法,将数组转换为字符串,然后打印。 -
int[] luckyNumbers = smallPrimes; // 两个变量将引用同一个数组 int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers, luckyNumbers.length); // 拷贝到一个新的数组 luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length); // 增加数组大小 -
每一个
Java应用程序都有一个带String args[]参数的main方法。注意程序名并没有存储在args[]数组中。 -
Arrays类中的sort方法使用优化的快速排序算法。 -
Math.random方法将返回一个0到1之间(包含0、不包含1)的随机浮点数。 -
Java中可以使用多维数组,和不规则数组。多维数组实际被解释为“数组的数组”。int[][] a = new int[3][6]; // 二维数组 for (int[] row : a) // for each 打印二维数组 for (int value : row) {} System.out.println(Arrays.deepToString(a)); // 快速实现打印多维数组


浙公网安备 33010602011771号