Thinking in Java学习扎记(三)

第三章   控制程序流程
        在java的世界中,对象和数据的处理是通过运算符,而选择和判断则是靠控制语句来实现的。
        使用java运算符
        运算符的两个用处:1、运算符接受引数,并且产生新值,例如 int a=1+1;
                                            2、运算符也可以改变操作数的值 例如 i++;
        大多数的运算符都是可以作用与基本数据类型之上的,但是=、==、!=是例外,他们可以作用于任何对象之上。
        优先顺序
        这个其实我自己也很头疼的!所以我向来不记什么运算符的优先顺序,在搞不清楚的地方就加上括号,这样不但你自己看起来很明了,出错率也低,别人来看你的代码也是能清楚明白的。
        赋值和指派
        赋值的意义是取得运算符右边的值(任何常量、变量、能产生数值的表达式),并将该值传递给左边,使用运算符=号是因为基本数据类型存储的是实际的数值,并非句柄(也可以理解为c++中的指针),a=b;这句是把b这个具体数值传递给a这个变量,当你改变a的时候,b这个数值并不会随着你的a的改变而改变,但是当你在操作对象的时候就容易出现和上述现象相反的事情。当你在操作对象的时候,实际上操作的是对象的句柄,当你把某个对象指派给另一个对象时,实际上指派的是句柄,例如:
        class one
        {
             int i=0;
         }
         class two
         {
             public static void main(String[] args)
           {
             one o1=new one();
             one o2=new one();
             o1.i=10;
             o2.i=20;
             System.out.print("o1.i="+o1.i);//10
             System.out.println("o2.i="+o2.i);//20
             o1=o2;
             System.out.print("o1.i="+o1.i);//20
             System.out.println("o2.i="+o2.i);//20
             o1.i=30;
             System.out.print("o1.i="+o1.i);//30
             System.out.println("o2.i="+o2.i);//30
           }
         }
       class one在two中被创建2个对象,并且分别回被赋值为10 和20。输出当然就是10和20,接着把o2指派给o1,输出肯定是20 和20,但是奇妙的事情在第3次赋值的时候产生了,当我们把o1.i的值改为30的时候,发现为什么我们的o2.i也变成30了?我们并没有改变他的值啊!这是因为o1和o2中都含有同一个句柄,原先的o1所存储的句柄被覆写了,地址指到了和o2一样的内存空间,而他原先的指向的那个内存空间在适当的时候会被垃圾回收机制给回收了,其实这个过程就发生在我们以为不会有问题的第2次赋值中!以上的现象就叫做别名现象,这个在Thinking in Java的附录a中有专题讲到!如果我们不想发生这样的事情,我们可以使用o1.i=o2.i这句话来进行第2步,这样的写法可以保证2个对象的相互独立,但是这个并不是一个好方法,这样直接操作对象内的数据会导致混乱,并且和oop的思想相违背,更好的方法在附录a中有讲到。
调用函数时的别名问题
           class one
           {
            int i=10;
           }
           class two
           {
            static  void hello(one o)
            {
             o.i=20;
            }
            public static void main(String[] args)
            {
             one someone=new one();
             System.out.println(someone.i);
             hello(someone);
             System.out.println(someone.i);
            }
           }

           我们的java程序会在hello()函数的生存空间之内为我们创建一个名字叫个o的one的实例对象,用于接受外界传递进来的引数,但是我们使用上面的方法,传递进去的其实也只是一个someone的句柄,而hello()之内的那个名字叫个o的对象的i的更改也会影响到超出hello生存空间之外的someone中的i,真是郁闷啊!
数学运算符
        这里我们要注意一个问题就是整数的除法运算所得结果会把小数部分忽略,注意不是四舍五入!什么是简略运算符?简略运算符是在运算符之后紧跟一个=号,这个方法使用于java中的所有运算符,例如:把x+10的值从新赋值给x,你就可以用x+=10这种简略形式。具体的数学运算符的例子我就不给大家举了,因为这个很简单,和我们小学学习的数学运算没有什么差别。
       一元运算符
       负号(-)和正号(+)都是一元运算符
       递增和递减
       递增(++)和递减(--)他们都有两种形式,一个是前缀(++i),一个是后缀(i++),需要注意的是,这两个方法是有差别的,在使用前缀的时候,是先进行前缀的运算,然后把值传递给i,然后i再参与后面的运算,而使用后缀时候,是先把i参与运算,再将i 进行后缀的运算,例如:
         public class test
         {
          public static void main(String[] args)
          {
           int i=0;
           System.out.println(++i);//1
           System.out.println(i++);//1
           System.out.println(i);//2
          }
         }
         答案是1、1、2 先进行自加,然后把值显示(1)第二次显示是先把i的值显示(1),在自加(2),但是自加的没显示因为自加的值参加下次的运算,也就是第三次显示2的原因。
关系运算符
逻辑运算符
        这个其实是我最郁闷的地方,因为我本身就记不住什么and or not 代表什么意思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值