Java零基础自学DAY4 2018-03-16
流程控制与数组篇
顺序结构:程序从上到下逐行执行
分支结构:
if 语句:
形式1
if ( logic expression)
{
statement
}
形式2
if ( logic expression)
{
statement
}
else
{
statement
}
形式3
if ( logic expression)
{
statement
}
else if ( logic expression) //可以有多个else if
{
statement
}
else // 最后的else 可以省略
{
statement
}
使用if...else语句时,如果省略花括号,则if只控制到紧跟该条件语句的第一个分号处
使用if...else语句时,先处理包含范围更小的情况
switch 语句
由一个控制表达式和多个case标签组成,控制表达式的数据类型只能是byte、short、char、int 四种整数类型;枚举类型 和 java.lang.String 类型,不能是boolean类型
switch (expression)
{
case condition1:
{
statement(s)
break;
}
case condition2: // 一直可以到case conditionN
{
statement(s)
break;
}
default:
{
statement(s)
}
}
先对expression求值,然后一次匹配condition1、condition2 ...N,遇到匹配的值即执行对应执行体,如果所有case标签都不与expression表达式的值相等,则执行default标签的代码块
和if语句不同的是:switch语句各case标签后代码块的开始点结束点非常清楚,因此完全可以省略case后代码的花括号
break的功能:结束switch程序,如果缺失,则会引入陷阱
switch可以使用java.lang.String类型变量
循环结构
初始化语句(init_statement):完成初始化工作
循环条件(test_statement): 决定是否执行循环体
循环体(body_statement): 如果循环条件允许,代码块将被重复执行
迭代语句(iteration_statement): 控制循环条件中的变量,控制循环结束
1. while循环
[init_statement]
while(test_statement)
{
statement;
[iteration_statement]
}
while循环和死循环
操作陷阱:当while循环的循环条件后紧跟一个分号,形成死循环
2. do while 循环
[init_statement]
do
{
statement;
[iteration_statement]
}while(test_statement);
与while循环区别:do while 循环的循环条件后必须有一个分号,表明循环结束
运行结果:
do while 循环体至少循环一次
3. for 循环
for ([init_statement]; [test_statement]; [iteration_statement])
{
statement
}
得到结果
多个变量:
得到结果:
'p++'为迭代语句[iteration_statement],最后计算
错误情况:
count *= 0.1,改变了循环变量的值,如需访问修改循环变量得知,应重新定义一个临时变量
for循环 替代 while循环:
当初始化语句(init_statement)放在循环体外,迭代语句(iteration_statement)放在循环体内时,即类似与while循环
额外定义一个量来保存循环变量的
选择循环变量时,尽量选择 i、j、k 来作为循环变量
4. 嵌套循环
内层循环结束时,开始执行外层循环
得到结果:
控制循环结构
1. 使用break结束循环
用于完全结束一个循环,跳出循环体
break结束外层循环:
标签就是紧跟( : )的标识符
运行结果为:
break outer命令导致结束outer标签指定的循环,不是结束break所在循环
break后的标签必须在break所在外层循环之前定义才有意义
2. 使用continue忽略本次循环剩下语句
与break的区别:只忽略本次循环剩下语句接着开始下一次循环,并不会终止循环;break则完全终止循环本身。
运行结果:
当i=1时,忽略了continue语句后的代码
当continue放在本次循环最后一行时,则没有意义
continue也可以紧跟标签:
得到结果
即当i=1时,continue便结束外层单次循环,直接开始下一次循环,并不会完全终止
continue后的标签必须在continue所在外层循环之前定义才有意义
3. 使用return结束方法
return的功能是用来结束一个方法,而不是一个循环
return直接结束整个方法,不管return处于多少层循环内
运行结果:
当 i = 1时,程序完全结束
5. 数组类型
在一个数据中,数组元素的类型是唯一的,一个数组里只能储存一种数据类型的数据
int是基本类型,int[]是引用类型
1.定义数组
type[] arrayName;
type arrayName[]; (不推荐)
定义数组时不能指定数组的长度
2.数组的初始化
静态初始化: 程序员指定每个数组元素的初始值,系统决定数组长度
arrayName = new type [] {element1, element2, element3 ... }
type [] arrayName = {element1, element2, element3 ... }
动态初始化:程序员只指定数组长度,系统为数组元素分配初始值
arrayName = new type [length]
动态初始化时,系统按如下规则分配:
整数类型,数组元素的值是0
浮点类型,数组元素的值是0.0
字符类型,数组元素的值是'\u0000'
布尔类型,数组元素的值是false
引用类型,数组元素的值是null
不要同时使用静态初始化和动态初始化!
3. 使用数组
错误异常:索引值大于数组长度
运行结果:
输出数组:int类型初始化值为0
运行结果:
动态初始化数组赋值:books使用了动态初始化,初始值为null
运行结果
4. foreach 循环
for (type variableName : array | collection)
{
}
type是数组元素或集合元素的类型,variableName是一个形参名,foreach循环将自动将数组元素、集合元素依次赋给该变量。
运行结果:
如果希望改变数组元素的值,则不能使用foreach循环
运行结果:
6. 深入数组
6.1 内存中的数组
运行结果为:
数组的长度不会改变,b只是改变了引用对象
6.2 基本类型数组的初始化
6.3 引用类型数组的初始化
如果一个class前面如果添加了public修饰则可以被所有类引入使用,如果没有加任何修饰词,那么就只能够被同包中的类和本类引入使用。
如果class类名的前面如果修饰的public则这个class类的文件命名必须和类名相同