# 流程控制结构
流程控制部分请顺应程序的过程自行品味一番, 你就明白了!
# 条件结构
# if-else条件式
int a = 0;
int b = 1;
if(a == b){
//注意, 比较是否一致应该用双等号, 而不是单等号
//只有赋值才用单等号
System.out.println("相等");
}else{
System.out.println("不相等");
}
输出结果:
不相等
你也可以把else部分去掉单独留下if.
int a = 1;
int b = 1;
if(a == b){ //如果不相等, 那在这里就什么也不输出了
System.out.println("相等");
}
输出结果
相等
如果if的内容只有一句话, 那可以省略掉if的花括号.
int a = 0;
int b = 1;
if(a == b)
System.out.println("相等");
else
System.out.println("不相等");
输出结果
不相等
比较String
时不能这样比较, 对象之间比较是否一样应该用equals
方法.
String a = "hi";
String b = "hi";
if(a.equals(b)) //你也可以写 b.equals(a)
System.out.println("相等");
else
System.out.println("不相等");
输出结果
相等
你还可以表演一波套娃.
String a = "hi";
String b = "hi";
String c = "hello";
if(a.equals(b)){
System.out.println("相等");
if(b.equals(c)){
System.out.println("并且b和c也相等");
}else{
System.out.println("但是b和c不相等");
}
}else{
System.out.println("不相等");
}
输出结果
相等
但是b和c不相等
其实究其本质, 刚才的比较数字a==b
代表着一个boolean
值, a.equals(b)
的原因是调用了a
对象的equals
方法, 这个方法的返回值是一个boolean
值(还记得boolean吗? 它是8大基本类型之一).
boolean值内容只有两种, true
和false
.
也就是, if其实判断的是后面的括号里是true
还是false
. 你可以这样试试:
if(true){
System.out.println("你会发现这代码一定会被执行");
} else {
System.out.println("但是这行代码不会, 所以你在这里骂人, 别人不拆你的程序, 他就不知道.");
}
输出结果
你会发现这代码一定会被执行
同理, 改成if(false)
以后, 刚才我说可以用来骂人的地方就会被执行, 别人就可以知道了.
# 对抗null
请看下面的操作:
String str = null; //诶? 我给str的初始值是null
System.out.println(str.equals("hi"));
结果报错了. 报错内容是NullPointerException
, 这代表着错误的类型, 你可以在报错内容中找一找NullPointerException
, 琢磨一下报错信息怎么看.
学会看报错也是非常重要的本领, 我就不相信你写的插件没报过错!
null
代表空指针, 意思是str
里面我什么也不放, 我就愿意让它在那里空着.
很明显, str
里面没对象, 没对象的话我们str.equals("hi")
, 执行的是谁的equals
呢? 这就有问题.
如果str
代表用户输入的东西, 万一用户给我们一个null
过来怎么办? 我们应该警惕null
!
对抗null
的工具就是if
!
String str = null;
if(str == null) {
System.out.println("你个瓜娃娃是憨批? 啥也不给我让我给你弄啥子?");
} else {
System.out.println("abc".equals(str));
}
# 与或运算
Java给出了四种运算符, 它们专属于boolean 分别为|
、||
、&
、&&
.
前两个为或, 后两个为与. 其实很好理解.
用这个东西的时候需要捋顺它们的逻辑关系.
int i1 = 1;
int i2 = 2;
int i3 = 3;
String str1 = "hi"
String str2 = null;
String str3 = "hi";
//第一步, 我想让i1 i2里任一有个数字是2
if(i1==2 || i2==2){ //这里你可以把 || 改成 |
//第二步, 我想看看str1 str3是不是都是 hi
if(str1.equals("hi") && str3.equals("hi")){
//第三步, 我想看看str1 str2 str3其中是不是有一个是hi
//注意, str2是null, 比较会报错
//我感觉这里程序要完蛋了
if(str1.equals("hi") || str3.equals("hi") || str2.equals("hi")){
System.out.println("顺利运行");
}
}
}
运行结果:
顺利运行
嗯???没报错! 我们认为那里str2
是null肯定会报错, 其实并没有.
把那一行的 || 改成 | 以后, 程序因为str2
是null报错了.
其实&& 和 ||的意思是“不刨根问底”. 也就是知道结果就跑路.
用这种思乡分析一下刚才没报错的原因, 其实很简单, 它已经发现str1.equals("hi")
是true
了, 直接导致str1.equals("hi") || str3.equals("hi") || str2.equals("hi")
整体就是true
了, 实际上后面的str3.equals("hi")
与str2.equals("hi")
根本就没被执行.
我们也可以看到&&也有这样的性质
String str1 = "hi"
String str2 = null;
if(str1.equals("hello") && str2.equals("hello")){
System.out.println("好!");
} else {
System.out.println("啥?");
}
输出结果
啥?
因为str1.equals("hello")
已经是false
了, 已经不用继续看了, 那么str2.equals("hello")
不会被执行, str1.equals("hello") && str2.equals("hello")
整体就是false
.
# 英文感叹号
不解释, 直接看:
if(1==2){
//这里肯定不会被运行
}
if(1!=2){ //判断1是不是不等于2
System.out.println("1不等于2");
}
if(!"hi".equals("hello")){
System.out.println("hi 和 hello 不一样");
}
boolean b = true; //现在它是true
b = !b; //如果你在一个布尔量前面加个英文感叹号的话
System.out.println(b);
输出结果
1不等于2
hi 和 hello 不一样
false
也就是说, "hi".equals("hello")
代表false
, !"hi".equals("hello")
代表着true
, 感叹号让结果反过来了.
# 循环结构
# for循环
在Java中如果要重复性执行某代码, 可以使用for循环. 基本语法之一如下:
for(初始式; 条件,如果这个式子结果一直是true那么一直执行; 重复式,一次循环完毕后执行一次){
重复的代码;
}
比如:
//一般我们都有个习惯, 第一个数字是0
for(int i=0;i<10;i++){
//i++的意思就是i=i+1
//这里循环内容要是只有一句话也可以省略花括号
System.out.println("我想吃桃子x" + i);
}
输出结果
我想吃桃子x1
我想吃桃子x2
我想吃桃子x3
我想吃桃子x4
我想吃桃子x5
我想吃桃子x6
我想吃桃子x7
我想吃桃子x8
我想吃桃子x9
我想吃桃子x10
其实就是等效于:
int i=0;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
//然后JVM就一直帮你复读
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) //这时候i=10不满足条件了, 在这个时候停止了
# 遍历for
如果有个数组:
int[] nums = {1,2,3,666,999,888,444};
我想遍历一遍这个数组, 把每个数都输出出来怎么办? 你可以这样写:
for(定义元素 : 数组){
代码
}
下面是个例子
for(int num:nums){
System.out.println(num);
}
# while循环
结构如下
while(条件,布尔值为true就会一直执行){
循环的代码
}
# 死循环
如果你想让这个代码形成死循环, 那么:
for(;;){
循环的代码
}
或者
while(true){
代码
}
# break与continue
for(int i=0;i<10;i++){
if(i==5)
continue;
System.out.println(i);
}
输出结果
1
2
3
4
6
7
8
9
10
可以发现, continue
代表跳出本次循环
for(int i=0;i<10;i++){
if(i==5)
break;
System.out.println(i);
}
输出结果
1
2
3
4
可以发现, break
代表结束整个循环
← 关键字、类与方法深入 常见数据类型 →