(Assignment)赋值操作符“=”
赋值操作符“=”是指把右边的值拷贝到左边,右边的内容可以是变量、或是会产生一个结果的表达式,但是左边的值必须是一个变量(即指必须有一个物理存储位置来存储右边的值),当然可以把一个常量赋值给一个变量。如:
a = 4 ;//合法的赋值语句
但是不能像如下赋值:
4 = a ;//错误的赋值语句
使用赋值操作符“=”是指把内容(值)从一个地方拷贝到另一个地方,比如:
a = b ;//将b中的内容拷贝到a中
此时,如果重新定义a的值,那么这个定义不会影响b的值,这在很多情况下是非常有用的。
注意:Java数据类型分为原始数据类型和对象数据类型,原始类型有 int 、boolean 、 double,对象类型即为Java类的实例。如果将一个原始数据类型赋值给另一个变量,则相当于复制一份,各自修改值互不干涉;而如果将对象类型赋值给另外一个对象,则只是复制给它对象的引用,修改该对象的值两者都会修改。下面通过代码进行进一步的说明。
1-1 对象类型赋值的例子
class Tank { int level; } public class Assignment { public static void main(String[] args) { Tank t1 = new Tank(); Tank t2 = new Tank(); t1.level = 9; t2.level = 47; System.out.print("1: t1.level: " + t1.level + ", t2.level: " + t2.level); t1 = t2; System.out.print("2: t1.level: " + t1.level + ", t2.level: " + t2.level); t1.level = 27; System.out.print("3: t1.level: " + t1.level + ", t2.level: " + t2.level); } }
执行的结果如下:
以上代码的结构很简单,main()创建两个实例,分别赋予不同的值,然后将t2赋值给t1,最后改变t1的值,因为是对象的引用的赋值,所以当t1的值改变时,t2的值也会随之而改变,因为t1和t2包含指向同一对象的相同的引用。
注意:以上这种现象称为接口(aliasing),而这是Java面向对象的基础。
如果不想使用aliasing,可以使用如下语句:
t1.level = t2.level ;
当然这种方式混乱,而且于Java面向对象的设计原则背道而驰。
自增、自减操作符(Auto increment and decrement)
Java中的自增、自减操作符是指“++”、“--”,每一种又包含前缀和后缀两种形式。
++i ,先将i加1,再参与运算。
i++ ,先参与运算,再将i加1。
--i ,先将i减1,再参与运算。
i-- , 先参与运算,再将i减1。
下面通过代码进行进一步的说明。
1-2 自增、自减操作符的例子
public class AutoInc { public static void main(String[] args) { int i = 1; System.out.println("i : " + i); System.out.println("++i : " + ++i); // Pre-increment System.out.println("i++ : " + i++); // Post-increment System.out.println("i : " + i); System.out.println("--i : " + --i); // Pre-decrement System.out.println("i-- : " + i--); // Post-decrement System.out.println("i : " + i); } }
运行的结果如下:
比较运算符(关系运算符)-Relational operators
比较运算符(关系运算符)包含以下几种:
<
<=
>
>=
== (等于)
!= (不等于)
比较运算符返回boolean类型的值,即返回true 或false 。
1-3 两个对象的比较
public class Equivalence { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1 == n2); System.out.println(n1 != n2); } }
运行的结果如下:
注意:代码1-3中“==”比较的是两个对象是否是同一个引用,显然在上述代码中通过“new”关键字创建的是两个不同的对象。
而在有的时候要比较两个对象的值(contents)是否相等,需要使用 equals() 方法,它与“==”有着本质的区别。下面通过代码进行进一步的说明。
1-4 equals() 方法比较对象的值是否相等
public class EqualsMethod { public static void main(String[] args) { Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1.equals(n2)); } }
运行的结果如下:
但是equals() 方法并不是这么简单,如果创建自己的类,像下面的代码:
1-5 自己创建的类中的equals() 方法的使用
class Value { int i; } public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); } }
运行的结果如下:
运行结果为“false”,这是因为equals() 方法默认的操作是比较引用,所以除非在自己的类中重写了equals() 方法,否则就像上面的代码一样,得不到的期望的结果。
注:文章的代码摘自 Thinking in Java(Fourth Edition)英文版,作者 [美]Bruce Eckef,刘中兵 评注。