(2021-08-16)
数组
Java的数组被创建后,只能用来存储指定类型的信息。比如可以有int
数组、String
对象的数组或数组的数组,但一个数组不能同时存储String
对象和int
值。
一个规避这种限制的方法:一个数组可同时存储特定类及其所有子类的对象,因此一个Object
数据可包含任何Java对象,包括与基本类型对应的类的对象。
在Java中创建数组,按下面过程进行
- 生命一个用于存储数组的变量
- 创建一个数组对象,并将它赋给数组变量
- 在数组中存储信息
数组声明
声明的数组变量指出了数组将存储的对象或数据类型以及数组的名称。声明方式有两种,即类型后加[]
和变量名后加[]
。
String[] a;
Point[] b; //数组存储的对象是Point的对象
float[] c;
// 下面这样的形式与上面等效
String a[];
Point b[];
float c[];
数组是一个对象。
(2021.08.18 Wed)
创建数组对象
因数组是对象,创建时需要new
关键字。
String[] players = new String[10]; //定义了一个长度是10的String数组
使用new
创建数组对象时,其所有元素都被自动的初始化。
类型 | 默认初值 |
---|---|
数字 | 0 |
boolean | false |
char | '\0' |
对象 | null |
数组赋初值的方式,可逐一赋值,比如
Interger[] series = new Integer[3];
series[0] = new Integer(10);
series[1] = new Integer(5);
series[2] = new Integer(999);
或者在初始化时将数组元素放在大括号中,用逗号分隔
Point[] m = {new Point(1,5), new Point(996, 0), new Point(7, 24)};
注意到String
对象可以不用new
来创建和初始化,用作字符串数组时,也可以如下初始化
String[] t = {"Mr.", "Mrs.", "Miss", "Dr."};
所有数组都有一个名为length
的实例变量,指出了数组包含多少个元素。如刚刚定义的字符串数组t
,有t.length = 4
。
访问数组元素时,index不能超过length
变量,否则Java编译器返回错误消息ArrayIndexOutOfBoundsException
。
访问数组和修改数组的方式同Python。
注:指定整数字面量时,将每3位编组并用下划线_
分割,让数字更加容易阅读。
short[] a = new short[2];
a[0] = 10_000;
多维数组
数组可以多维,仅需在声明时加入相应个数的中括号。
int[][] dayValue = new int[53][7]; // 定义了一个53行7列的数组
int[][][] cen = new int[100][53][7]; // 定义了一个100*53*7的数组
System.out.println('Elements in 1st dimension: ' + cen.length);
System.out.println('Elements in 2nd dimension: ' + cen[0].length);
System.out.println('Elements in 3rd dimension: ' + cen[0][0].length);
块语句
用花括号(brace)括起来的内容是一个块语句(block statement)。Java块中声明的局部变量创建了作用域,在块中定义的变量仅能在块中使用。在块执行完毕后,在块中定义的变量将不复存在。
void testBlock() {
int x = 10;
{
int y = 40;
y = y + x;
} // y的作用域到此结束
}
判断和循环语句
if条件语句
Java要求if的测试返回值只能是boolean
值,即true/false
,而在Python、C和C++中,测试可以返回整数值。
...
String server;
if (arguments.length < 1) {
server = "localhost";
} else {
server = "xxx";
}
// 另一个例子
if (operation == '+')
add(o1, o2);
else if (operation == '-')
subtract(o1, o2)
else if (operation == '*')
multiply(o1, o2)
else if (operation == '/')
divide(o1, o2)
switch条件语句
if
语句的最后一个例子,是嵌套if
语句。和C/C++相同,Java提供了一个更好的方式处理这种情况,也就是switch
语句。
char grade = 'D';
switch (grade) {
case 'A':
System.out.println("Superb!");
break;
case 'B':
System.out.println("not bad");
break;
case 'C':
System.out.println("so so");
break;
case 'D':
System.out.println("work harder please");
break;
default:
System.out.print("wth");
}
每个case
语句之后,可以有任何数目的语句,不必像if
语句那样用花括号括起来。
每个case
都有一个break
语句,用于指出何时停止执行语句。如果case
中没有break
语句,则找到匹配的情况后,该case
中的语句及其后到break
或switch
末尾的所有语句都将执行。请记得多数情况下为每个case
语句加入break
语句。
int x = 5;
switch (x) {
case 2:
case 4:
case 8:
System.out.println("even number");
break;
default:
System.out.println("odd number");
}
上面这个指令返回odd number
。
int month = 10;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
count = 31;
break;
case 4:
case 6:
case 9:
case 11:
count = 30;
break;
case 2:
count = 28
}
上面代码的返回结果是31
。
(2021.08.19 Thur)
三目运算符
也叫条件运算符,格式为
test? trueResult:falseResult
相当于if
判断。比如比较myScore
和yourScore
两个变量,返回其中比较大的那个并返回赋值给变量bestScore
。
bestScore = myScore > yourScore? myScore: yourScore;
该语句等效于
if (myScore > yourScore) {
bestScore = myScore;
} else {
bestScore = yourScore;
}
三目运算符的优先级很低,通常在所有子表达式计算完毕后才被计算,唯一比它优先级低的运算符是赋值运算。
for循环
格式如下
for (initialisation; test; increment) {
statement;
}
其中的test
部分是boolean
格式的表达式,当不满足该条件,则停止循环。一个例子
String[] salutation = new String[10];
byte i;
for (i = 0; i < salutation.length; i++) {
salutation[i] = "Dr.";
}
一种特殊情况是每次循环什么都不做,可以简单的表达为
for (i = 0; i < salutation.length; i++);
while和do循环
这两类循环让Java代码重复执行,直到满足条件为止。
while
循环
while (i < 10) {
x += i;
}
这个循环中因只有一条语句,所以不用花括号也可以使用,但如果循环体内有多条语句,用花括号是必需的。
do
循环与while
循环类似,区别在于检测条件的位置,且do
循环检测条件之前,至少执行循环体一次。
long i = 1;
do {
i += 1111;
System.out.println(i + " ");
} while (i < 3_000_000_000);
跳出和继续循环 break和continue
break
跳出循环,continue
执行下一次循环。
Reference
1 R. Cadenhead著,袁国忠译,21天学通Java(第7版),中国工信出版集团,人民邮电出版社
网友评论