第四章执行控制流程
程序在执行过程中控制他的世界,利用执行控制语句。
Java 使用了 C语言中的所有流程控制语句,Java中设计的关键字 if-else while do-while for return break 以及选择语句 switch。
Java 中不支持 goto语句但是有类似的 goto 跳转。
4.1true false
所有条件语句利用条件表达式的结果(真或者假) 来决定执行路径。Java 不像是 C语言或者 c++可以用数值结果作为布尔值使用。
4.2 if-else
程序中有一个静态的整形 int变量,我知道静态修饰的方法是静态方法直接调用唯一途径。果然要查询了之后才能明白。
https://blog.csdn.net/oguro/article/details/53008848
链接里面主要讲的是 static 的作用。当数据或者是方法要进行共享的时候,就是用 static 修饰,他是一开始就在类中加载,(就像是 main 方法,他被 Java 虚拟机特定识别加载使用)在内存中只有一份,这样大大减少了内存的使用。static 修饰的变量或者是方法的访问方式两种,但是非静态的只有一种(通过对象访问)
http://www.cnblogs.com/zhangkeyu/p/6657702.html
这个链接讲的主要是方法的调用,但是他没有讲到不同类之间的情况。同一个类下面方法之间的调用可以组成四种可能:1.非非 2.静静 3.非调用静 4.静调用非。静态的变量应该也是这样的
不同的类之间的方法调用,情况就比较复杂了,非非用对象,非调用静皆可以,静静可以用类,静调用非,只有变量可以. 这是我自己写的,用来测试不同类之间,静态方法和非静态方法对另一个类中的方法或者变量(非静态和静态)怎么获取使用情况。我在原先的基础上将 public 类多加了一个非静态变量i和非静态方法noStatic()用以测试这些想法
class TestStatic {
public static void main(String[] args) {
// 3.静静 使用对象或者是类调用方法和变量
IfElse ie = new IfElse();
print(ie.i);
print(IfElse.result);
IfElse.test(1, 3);//输出0
print(IfElse.result);
// 4.静调用非,静态方法可以用对象调用非静态的变量和方法、、、
int a = new IfElse().i;
new IfElse().noStatic();
}
public void noneStatic() {
// 1.非非要用对象而不是类调用
IfElse ie = new IfElse();
print(ie.i);
ie.noStatic();
// 2.非调用静 可以用对象调用静态的变量,但不可以调用静态方法。可以用类调用方法和变量
IfElse ie2 = new IfElse();
print(ie.result);
print(IfElse.result);
IfElse.test(1, 2);
}
}
以我打代码的经验来讲,
1.首先方法和变量最常用的是同一个类下的方法和变量的调用,特点是静态变量和静态方法可以直接被任何调用,但是非静态的方法或者变量要想被同一个类下的 main()调用,就必须要使用到实例对象了。
2.那么怎么记忆不同类之间的调用嘞?因为不同类之间的调用大多都是静态方法调用另一个类的方法和变量(静态或者非静态,四种组合),像是我做过千百遍的静态调用非静态就是一直用的对象实例(也只有这种方法),但是在调用静态的就两种都可以了
3.这些调用难点在于记住不同类下面,非静态方法进行的调用。但是由于我们在设计的时候,经常把功能类和测试类分开写,测试类中也只有一个叫main 的主方法,而没有一个非静态方法给我来试验,所以。。。。但是未雨绸缪,现在不用的原因可能是自己写的项目比较小,等到做大项目了可能就要用这些了。
注意:else if 并不是新的关键字只是 else 后面的另一个新的 if 语句。
4.3迭代
while do-while 还有 for 用来控制循环。
while 比 do-while 更常用的原因,for 最常用的原因都很简单。for 中定义的变量要注意其作用域。程序这里使用了包装器类中的静态方法来判断,我看了一下方法好多。
if(Character.isLowerCase(c))//使用了 java.lang.Character 中的包装器类
我觉得很有道理,我虽然对 C语言和 c++练习的不够多,但是 Java 我的确感受到了他自然地编程风格,变量在需要的时候才定义使用,而非一开始就定义。
4.3.3 逗号操作符
逗号分隔符与之不同,分隔符顾名思义是用来分隔函数的不同参数,Java中唯一能够用操作符的是 for 循环的控制表达式(初始化和步进部分)。初始化可以定义多个变量但是这些变量只能是同一类型的。
4.4Foreach 语句
Java SE5引入更简洁的 for语句用于数组和容器(16章和17章)。不必创建 int 变量去计数,定义一个与数组相同类型的变量 x, 继而将数组中每个元素一一赋值。当然不仅是数组,还有字符串(String 类中有一个方法可以返回一个 char 数组,这样就可以使用 foreach 迭代了)
关于重载的问题,相同的方法名可以有不同的参数列表(不是返回值,多少,顺序以及类型三个)。range()是作者自己写的生成器,就像是 print()和 print(Object o)以及 printnb(Object o) 还有
// The new Java SE5 printf() (from C):
public static PrintStream
printf(String format, Object... args) {
return System.out.printf(format, args);
}
每次我讲一个返回值为 void 放在里面都会提示错误,说明 void 不是 Object 类也不是 null。
4.5return
无条件分支关键字如人turn,break,continue ,类似goto
return 关键字作用:1.方法指定返回值 2.退出当前方法
如果方法有返回值,就要确保每一条路径(这个路径指的应该是同等地位但是根据条件有着不同走向的)有一个返回值
4.6 break 和 continue
前者是结束了整个循环,后者是整个循环的某一次迭代跳过。
我没有想到 return 类似于 break 的效果
public static int testReturn(){
print("test 测试return 的 break 效果:");
for(int x: range(10)){
print(x);
if(x==3)
return 0;
}
return 1;
}
4.7臭名昭著的 goto
goto 是 Java中的保留字,但是未在 Java使用它。但有类似的东西出现,如 break 和 continue ,三者因为标签而结缘。
我对这个不怎么熟悉的程序进行了修改,发现了 break 和 continue 到达的位置,发现 break 和 continue 可以互相转换。但是我还有点困惑的是 i++ 是什么时候进行的,比如说 for 循环的 i++是在循环的某次迭代完成之后进行下一次迭代之前(更准确的说是在 for循环中的条件控制语句之前)。因此break inner 和 continue outer 都是要进行 i++的。
注意:Java中使用标签的唯一理由是循环嵌套的存在。
4.8switch 选择语句
根据整数表达式(整数选择因子可以使 int 或者 char)的值,选择路径分支。
注意语句后边的 break,缺失了之后会造成不可挽回的结果。
第五章有一个 enumJava se5的新特性
Int c = rand.nextInt(26) + 'a';字符能够隐式转换 int 类型,前面也学过(char short byte )
4.9总结:
Java 语言具有的基本特性:运算,操作符优先级,类型转换以及选择与循环