[Thinking In Java]代码整理之操作符(Operators)
2013-05-24 18:55
267 查看
(Assignment)赋值操作符“=”
赋值操作符“=”是指把右边的值拷贝到左边,右边的内容可以是变量、或是会产生一个结果的表达式,但是左边的值必须是一个变量(即指必须有一个物理存储位置来存储右边的值),当然可以把一个常量赋值给一个变量。如:
注意:Java数据类型分为原始数据类型和对象数据类型,原始类型有 int 、boolean 、 double,对象类型即为Java类的实例。如果将一个原始数据类型赋值给另一个变量,则相当于复制一份,各自修改值互不干涉;而如果将对象类型赋值给另外一个对象,则只是复制给它对象的引用,修改该对象的值两者都会修改。下面通过代码进行进一步的说明。
1-1 对象类型赋值的例子
以上代码的结构很简单,main()创建两个实例,分别赋予不同的值,然后将t2赋值给t1,最后改变t1的值,因为是对象的引用的赋值,所以当t1的值改变时,t2的值也会随之而改变,因为t1和t2包含指向同一对象的相同的引用。
注意:以上这种现象称为接口(aliasing),而这是Java面向对象的基础。
如果不想使用aliasing,可以使用如下语句:
自增、自减操作符(Auto increment and decrement)
Java中的自增、自减操作符是指“++”、“--”,每一种又包含前缀和后缀两种形式。
++i ,先将i加1,再参与运算。
i++ ,先参与运算,再将i加1。
--i ,先将i减1,再参与运算。
i-- , 先参与运算,再将i减1。
下面通过代码进行进一步的说明。
1-2 自增、自减操作符的例子
比较运算符(关系运算符)-Relational operators
比较运算符(关系运算符)包含以下几种:
<
<=
>
>=
== (等于)
!= (不等于)
比较运算符返回boolean类型的值,即返回true 或false 。
1-3 两个对象的比较
注意:代码1-3中“==”比较的是两个对象是否是同一个引用,显然在上述代码中通过“new”关键字创建的是两个不同的对象。
而在有的时候要比较两个对象的值(contents)是否相等,需要使用 equals() 方法,它与“==”有着本质的区别。下面通过代码进行进一步的说明。
1-4 equals() 方法比较对象的值是否相等
但是equals() 方法并不是这么简单,如果创建自己的类,像下面的代码:
1-5 自己创建的类中的equals() 方法的使用
运行结果为“false”,这是因为equals() 方法默认的操作是比较引用,所以除非在自己的类中重写了equals() 方法,否则就像上面的代码一样,得不到的期望的结果。
注:文章的代码摘自 Thinking in Java(Fourth Edition)英文版,作者 [美]Bruce Eckef,刘中兵 评注。
赋值操作符“=”是指把右边的值拷贝到左边,右边的内容可以是变量、或是会产生一个结果的表达式,但是左边的值必须是一个变量(即指必须有一个物理存储位置来存储右边的值),当然可以把一个常量赋值给一个变量。如:
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,刘中兵 评注。
相关文章推荐
- [Thinking In Java]代码整理之操作符(Operators)(二)
- [Thinking In Java]代码整理之移位操作符(shift operators)
- [Thinking In Java]代码整理之三元运算符、强制类型转换、截取与舍入
- Java - Thinking in Java 第3章 操作符
- 【Java】HttpClient 使用(代码整理)
- Thinking in java-7 代码重用
- MongoDB-JAVA-Driver 3.2版本常用代码全整理(1) - 增删改
- Thinking in Java 3.操作符
- Java中把JSON和List结果集互转的代码片段整理
- Thinking in Java 整理笔记:通过异常处理错误
- 更新整理本人所属博客文章的示例代码和工具组件(Java 和 C++)
- 微信红包JAVA代码整理
- 自己整理的一套java编码规则,让自己写代码不会那么乱
- 更新整理本人所有博文中提供的代码与工具(Java,2013.08)
- Java代码注释规范_动力节点Java学院整理
- java基础知识记录--java代码查错 (摘自张孝祥整理java面试题)
- [转]整理关于java的String 类,equals函数和比较操作符的区别
- Java中把JSON和List结果集互转的代码片段整理
- 更新整理本人所有博文中提供的代码与工具(Java,2013.08)
- 更新整理本人所有博文中提供的代码与工具(Java,2013.08)