java中的操作符:1.操作符接收一个或多个参数,并生成一个新值;
2.有些操作符可以改变操作数本身的值,这被称为副作用,例如自增,自减操作符,这类带有副作用的操作符 的最普遍的用途就是用来产生副作用。但是使用此类操作符生成的值,与没有副作用的操作符生成的值没有什么区别。
3.几乎所有的操作符都只能操作"基本类型",例外的是"=","==","!="。这三个操作符可以操作所有对象。
4.String类支持"+","+="操作符。
java中的赋值操作符:"="
1.赋值操作符的意思:取右边的值,把它赋值给左边。右值可以是任何的常数,变量或表达式(只要它能生成一个值就行),但左值必须是一个明确的,已命名的变量。也就是说,必须要有一个物理空间可以存储右边的值;
2.常数不能作为左值。不能说4=a;
3.基本数据类型的赋值:基本类型存储的是实际的数值,而不是指向一个对象的引用,所以在为其赋值时,是直接将一个地方的内容复制到了另一个地方。例如对基本数据类型a使用a=b,即把b的内容复制给了a,若接着修改a,对b不会产生任何影响。
4.对对象进行赋值:对一个对象进行操作时,我们真正操作的是这个对象的引用,所以如果将一个对象赋值给另外一个对象
实际是将引用从一个地方复制到另一个地方,意味着如果对对象c复制c=d,那么c和d都指向原本只有d指向的那个对象,而赋值前c指向的那个对象在赋值后因为没有引用指向,将被垃圾回收器回收。
对象赋值的别名问题:
,主类里有个非主类,
,非主类很简单
输出结果为:
可以看到,把f对象赋值给e对象后,其实是把f对象的引用复制给了e对象,此时,e和f对象的引用都指向原来f指向的那个对象,所以,当改动2个对象中任何一个对象的属性时,另外一个的属性也同时被修改掉了。这就是对象赋值中的别名问题。
避免出现这个问题的话可以这样写:
只用对象的属性去传递值,这样输出结果为:
2个对象的属性建没有任何关联,只是将f1的属性值赋值给了e1一次,后续各自更改其属性值都对另外一个没有丝毫影响。
方法调用中的别名问题
将一个对象传递给方法时,同样会产生别名问题
这里新建一个Tank对象,给他的属性赋了值,然后将它传入方法f(),方法f()内容:
输出结果为:
很简单,给传入的Tank对象的level属性重新赋值。这样,方法f()似乎是要在其作用域内复制Tank tank1的一个副本,但其实只是传递了一个引用,实际改变的是f()之外的对象。