到day3为止基础的语法就算学习完毕了。
控制流程
块作用域:
块是指一对花括号阔起来的若干条简单的Java语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。
但是,不能在嵌套的两个块中声明同名的变量。
条件语句:
格式:
if(condition)statement
这里的条件必须用括号括起来。
块语句格式为:
{
statement1;
statement2;
}
例如:
if(yourSales >= target)
{
performance = “Satisfactory”;
bonus = 100;
}
当yourSales大于或等于target时,将执行括号中的所有语句。
在Java中,比较常见的条件语句格式:
if (condition)statement1 else satement2
循环
当条件为true时,while循环执行一条语句,格式为:
while (condition)statement
如果开始循环条件的值就为false,则while循环体一次也不执行。
while循环语句首先检测循环条件,因此,循环体中的代码有可能不被执行,
如果希望循环体至少执行一次,则应该将检测条件放在最后。
使用do/while循环语句可以实现这种操作方式,语法格式:
do statement while(condition);
确定循环
for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或类似的变量来控制迭代次数。
例如:写一个程序将数字1—10输出到屏幕上。
for(int i = 1; i<= 10; i++)
System.out.println(i);
for语句的条件语句,第1部分用于对计数器的初始化;第2部分给出每次新一轮循环执行前摇检测的循环条件;第3部分指示如何更新计数器。
Java中不成文的规则:for语句的3个部分应该对同一个计数器变量进行初始化、检测和更新。
当在for语句的第1部分中声明了一个变量之后,这个变量的作用域就为for循环的整个循环体。
特别指出,如果在for语句内部定义一个变量,这个变量就不能在循环体之外使用,因此,如果希望在for循环体之外使用循环计数器的最终值,就要确保这个变量在循环语句的前面且在外部声明。
可以在各自独立的不同for循环中定义同名的变量。
for循环语句只不过是while循环的一种简化形式。
例如:
for (int i = 10; i > 0; i–)
System.out.println(“Counting down…” + i );
可以重写为:
int i = 0;
while (i > 0)
{
System.out.println(“Counting down…” + i );
}
switch语句:处理多个选项
格式:
switch (choice)
{
case 1:
…
break;
case 2:
…
break;
……
}
Switch语句将从与选项值相匹配的case标签处开始执行直到遇到break语句,或者执行到switch语句的结束处为止,如果没有相匹配的case标签,而有default子句,就执行这个子句。
注意:有可能触发多个case分支,如果在case分支语句的末尾没有break语句,那么就会执行下一个case分支语句。这种情况常常会引发错误。
如果想使用switch语句,编译代码时可以考虑加上-Xlint:fallthrough选项,如下所示:
javac -Xlint:fallthrough Test.java
这样一来,如果某个分支最后缺少一个break语句,编译器就会给出一个警告消息。
case的标签可以是:
类型为char、byte、short或int(或其包装器类Character、Byte、Short和Intege)的常量表达式。
枚举常量。
从Java 7 开始,case标签还可以是字符串字面量。
当在switch语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由switch的表达式确定。
中断控制流程语句
break:用于跳出循环语句。
注意,break标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。
对于任何使用break语句的代码都需要检测循环是正常结束,还是由break跳出。
continue:将控制转移到最内层循环的首部。
例如:
将continue语句用于for循环中,可以跳到for循环的“更新”部分,例如,下面这个循环:
for (count = 1; count <= 100; count++)
{
System.out.print(“Enter a number , -1 to qiut:”);
n = in.nextInt();
if (n< 0) continue;
sum += n;
}
如果n<0,则continue语句跳到count++语句。
大数值
java.math包中的两个类:BigInteger 和 BigDecimal。这两个类可以包含任何长度数字序列的数值。
BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
使用静态的valueOf方法可以将普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(100);
但是不能用算数运算符处理大数值,而需要使用大数值类中的add和multiply方法。
BigInteger c = a.add(b); //c = a + b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); // d = c * (b + 2)
这个类中的加法用方法add()表示;乘法用multiply()表示;除法用divide()表示。
数组:数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。
在声明数组变量时,需要指出数组类型(数据元素类型紧跟 [])和数组变量的名字。
例如下面声明了整型数组a;
int[] a;
用new运算符创建数组。
int[] a = new int[100]; //这条语句创建了一个可以存储100个整数的数组。
数组长度不要求是常量: new int[n]会创建一个长度为n的数组。
创建一个数值数组时,所有元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null,这表示这些元素(还)未存放任何对象。
tips:如果创建了一个100个元素的数组,并且试图访问元素a[100](或任何在0~99意外的下标),程序就会引发“array index out of bounds”异常而终止执行。
获取数组中的元素的个数,可以使用array.length。例如:
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
一旦创建了数组,就不能再改变它的大小,如果经常需要在运行过程中拓展数组的大小,就使用另一种数据结构——数组列表(array list)。
for each 循环:这种循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心。
语句格式:
for (variable : collection) statement
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(当然,也可以是语句块)。collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象(例如ArrayList)。
例如:
for (int element :a)
System.out.println(element);
打印数组a的每一个元素,一个元素占一行。
for each循环语句的循环变量将会遍历数组中的每一个元素,而不需要使用下标值。
但不是每一个场景都适合使用for each,如果不希望遍历集合中的每一个元素,或者在循环内部需要使用下标值等。
有个更加简单的方式打印数组中的所有值,即利用Arrays类的toString方法。调用Arrays.toString(a),返回一个包含数组元素的字符串,这些元素被放置在括号内,并用逗号分隔。
数组初始化以及匿名数组
在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式。
例如:
int[] smallPrimes = {2,3,5,7,11,13};
在使用这种方法时,不需要调用new。
甚至可以初始化一个匿名的数组:
new int[] {17,19,23,29}
这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组。
例如:
smallPrimes = new int[] {17,29,23,29,31};
smallPrimes = anonymous;
允许创建一个长度为0的数组:new elementType[0],注意,数组长度为0与null不同。
数组拷贝:将一个数组变量拷贝给另一个数组变量,这时,两个变量将引用同一个数组:
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12; //now smallPrimes[5] is also 12
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyTo方法。
int [] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers,luckyNumbers.length);
其中,第2个参数是新数组的长度,这个方法通常用来增加数组的大小。
如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素。
命令行参数
每一个Java应用程序都有一个带String arg[] 参数的main方法,这个参数表名main方法将接受一个字符串数组,也就是命令行参数。
数组排序
使用Arrays类中的sort方法:
int[] a = new int[1000];
Arrays.sort(a);
这个方法使用了优化的快速排序算法。
Math.random方法将返回一个0到1之间(包含0、不包含1)的随即浮点数。
int r = (int) (Math,random() * n );
多维数组
多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式。
不规则数组
Java实际上没有多维数组,只有一维数组,多维数组被解释为“数组的数组”。