- 作者:xiaoxiao
- 发表时间:2020-12-23 10:36
- 来源:未知
第三章 控制程序流程 在java的世界中,对象和数据的处理是通过运算符,而选择和判断则是靠控制语句来实现的 使用java运算符 运算符的2个用处,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("o2.i="+o1.i); System.out.println("o2.i="+o2.i); o1=o2; System.out.print("o2.i="+o1.i); System.out.println("o2.i="+o2.i); o1.i=30; System.out.print("o2.i="+o1.i); System.out.println("o2.i="+o2.i); } } 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中有。