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
原创粉丝点击