thingking in java 读书笔记---控制程序流
来源:互联网 发布:linux 查看ip地址 编辑:程序博客网 时间:2024/04/30 14:26
所有的运算符只能操作基本数据类型,例外的是:=,==,!=。它们能操作所有对象,除此外,String能使用+,+=。
=:=有些东西需要说明一下,a=b,这种,当a,b都是基本变量类型的时候,其作用跟c++中的一样,是值拷贝,但是当a,b都是对象的引用的时候,这种赋值只是引用的改变,就像别名一样。结果两个引用都指向同一个对象上。而各自的对象还存在原来的堆中,只是如果有的对象没有引用指向它,就会被gc释放掉。
==、!=这两个比较运算符也得说说,对于基本数据类型,跟C++中没有甚么不同,但是对于类对象来说就不一样了。例如:
Integer a=new Integer(1);
Integer b=new Integer(1);
a==b?结果是不对的,因为这两个比较符比较的是引用,而不是它们所引用的对象的情况。如果两个引用都指向同一个对象,那么它们才是相等的。
那么我们有甚么方法比较a,b的对象是否是一样呢?
方法是用所有类都可以用的equals方法:
a.equals(b);结果是正确的。
但是如果是你自己新定义的类,又出问题了。比如:
class Value{
int I;
}
Value a=new Value();
Value b=new Value();
a.I=b.I=1;
a.equals(b);结果是错误的,原来equals函数是Object里面实现的,它的默认作用仍然是比较引用是不是一样。所以,你如果想要在你的类里面用它比较内容是否一样,那么需要重载。
逻辑运算符:&&,||,! 需要说明的是,跟c/c++里面不同的是,逻辑运算符不能作用与非boolean类型,例如:
int a,b;
a&&b.语法错误
位运算符: 在操作boolean类型的变量的时候,位运算符的作用与逻辑运算符一样,只是不会出现“短路”。
移位运算符:只说与c/c++的区别吧,加入了一个新的符号:>>>:无符号移位,不论数的符号是正是负,左边只补0;
还有一个问题: 移位运算符只能对整数进行,如果是byte, char, short等其他的基本运算符,那么就会先把它们转换成int,然后移位,返回的也是int,最后还要强制转换回去,这样做在对byte , char , short 等比int短小的类型进行时会出现错误。
同理,算术运算时也是一样,都会先转换成int然后计算。
例如:
import com.bruceeckel.simpletest.*;
public class URShift {
static Test monitor = new Test();
public static void main(String[] args) {
int i = -1;
System.out.println(i >>>= 10);
long l = -1;
System.out.println(l >>>= 10);
short s = -1;
System.out.println(s >>>= 10);
byte b = -1;
System.out.println(b >>>= 10);
b = -1;
System.out.println(b>>>10);
monitor.expect(new String[] {
"4194303",
"18014398509481983",
"-1",
"-1",
"4194303"
});
}
} ///:~
原因是这样的:例如当对char右移时,如果char本身为负数,那么在把char转换成int的时候,就会前面全部补0。移位后,再强制转换回来,那么就只是简单的截取,可能导致得到的char为-1。上面例子的最后一个,没有强制转换,得到了正确的结果。
类型转换:boolean类型不能允许任何的类型转换处理。
while(a=b){}象这样的例子,在java中不能编译通过,因为while期望一个boolean类型,除非是a和b都是boolean类型的。
continue和break
在单独使用的时候,跟c++中是一样的。java中,这两个关键字可以和标签一起使用,模仿goto的功能。需要说明的是,标签唯一起作用的地方就是在迭代的前面,而且标签和迭代之间不能有其他的语句。在for循环里面需要注意的是,step动作发生在for语句的最后,如果里面有continue,那语句实际上是跳到本循环的最后,step动作是有效的,但是break实际上跳出循环,故step动作无效。还有,continue outer;发生的时候,内层的step无效,外层的有效:看例子程序:
int j=0;
outer:
for(int i=0;i<10;i++){
System.out.println("shit "+j);
inner:
for(j=0;j<10;j++){
System.out.println("shit "+i+" "+j);
if(j==1){
continue;
}
else if(j==2){
continue outer;
}
if(i==3){
break outer ;
}
}
}
输出结果:
shit 0
shit 0 0
shit 0 1
shit 0 2
shit 2
shit 1 0
shit 1 1
shit 1 2
shit 2
shit 2 0
shit 2 1
shit 2 2
shit 2
shit 3 0
- thingking in java 读书笔记---控制程序流
- thingking in java读书笔记3
- thingking in java 读书笔记---RTTI
- thingking in java 读书笔记---对象引论
- thingking in java 读书笔记----一切都是对象
- thingking in java 读书笔记---初始化和清除
- thingking in java 读书笔记---异常处理
- thingking in java 读书笔记---复用和多态
- thingking in java 读书笔记----接口和内部类
- thingking in java 读书笔记---对象集合和容器
- thingking in Java 字符串
- thingking in Java 泛型
- thingking in Java 数组
- thingking in Java 注解
- thingking in Java 并发
- Thingking in Java学习笔记
- Thingking in Java 注册工厂
- thingking in Java 类型信息
- Network Protocol for Online Games by Michael Butler/Jennifer Louie/Jorge Pombar
- 比尔盖茨2007年4月在清华大学的演讲
- 诡异的JavaScript Closure
- Java开源GIS平台介绍
- 盖茨微软亚洲领导人论坛演讲实录
- thingking in java 读书笔记---控制程序流
- 我上传的附件资源链接: http://download.csdn.net/user/gxiyv
- test2
- 恶灌满门2007-04-19(聚餐)
- 订饭
- J2ME应用程序架构模型
- 一个关于ADO访问数据库实现分页
- vim + ctags + taglist + cscope + cppcomplete + global 使用初探zz
- Winsock工作模型