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指向的那个对象在赋值后因为没有引用指向,将被垃圾回收器回收。

对象赋值的别名问题:

Java 直接赋值好还是new java中赋值是什么意思_对象赋值

,主类里有个非主类,

Java 直接赋值好还是new java中赋值是什么意思_赋值_02

,非主类很简单

Java 直接赋值好还是new java中赋值是什么意思_赋值_03

输出结果为:

Java 直接赋值好还是new java中赋值是什么意思_赋值_04

可以看到,把f对象赋值给e对象后,其实是把f对象的引用复制给了e对象,此时,e和f对象的引用都指向原来f指向的那个对象,所以,当改动2个对象中任何一个对象的属性时,另外一个的属性也同时被修改掉了。这就是对象赋值中的别名问题。

避免出现这个问题的话可以这样写:

Java 直接赋值好还是new java中赋值是什么意思_对象赋值_05

只用对象的属性去传递值,这样输出结果为:

Java 直接赋值好还是new java中赋值是什么意思_对象赋值_06

2个对象的属性建没有任何关联,只是将f1的属性值赋值给了e1一次,后续各自更改其属性值都对另外一个没有丝毫影响。

方法调用中的别名问题

将一个对象传递给方法时,同样会产生别名问题

Java 直接赋值好还是new java中赋值是什么意思_Java 直接赋值好还是new_07

这里新建一个Tank对象,给他的属性赋了值,然后将它传入方法f(),方法f()内容:

Java 直接赋值好还是new java中赋值是什么意思_操作符_08

输出结果为:

Java 直接赋值好还是new java中赋值是什么意思_赋值_09

很简单,给传入的Tank对象的level属性重新赋值。这样,方法f()似乎是要在其作用域内复制Tank tank1的一个副本,但其实只是传递了一个引用,实际改变的是f()之外的对象。