• (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);
  }
}

执行的结果如下:

[Thinking In Java]代码整理之操作符(Operators)_第1张图片

以上代码的结构很简单,main()创建两个实例,分别赋予不同的值,然后将t2赋值给t1,最后改变t1的值,因为是对象的引用的赋值,所以当t1的值改变时,t2的值也会随之而改变,因为t1和t2包含指向同一对象的相同的引用。

注意:以上这种现象称为接口(aliasing),而这是Java面向对象的基础。

   如果不想使用aliasing,可以使用如下语句:

t1.level = t2.level ;

当然这种方式混乱,而且于Java面向对象的设计原则背道而驰

  • 自增、自减操作符(Auto increment and decrement)

Java中的自增、自减操作符是指“++”、“--”,每一种又包含前缀和后缀两种形式。

  1. ++i ,先将i加1,再参与运算。

  2. i++ ,先参与运算,再将i加1。

  3. --i ,先将i减1,再参与运算。

  4. 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);
  }
}

运行的结果如下:

[Thinking In Java]代码整理之操作符(Operators)_第2张图片

  • 比较运算符(关系运算符)-Relational operators

比较运算符(关系运算符)包含以下几种:

  1. <

  2. <=

  3. >

  4. >=

  5. == (等于)

  6. != (不等于)

比较运算符返回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);
  }
}

运行的结果如下:

[Thinking In Java]代码整理之操作符(Operators)_第3张图片

注意:代码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));
  }
}

运行的结果如下:

[Thinking In Java]代码整理之操作符(Operators)_第4张图片

但是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));
  }
}

运行的结果如下:

[Thinking In Java]代码整理之操作符(Operators)_第5张图片

运行结果为“false”,这是因为equals() 方法默认的操作是比较引用,所以除非在自己的类中重写了equals() 方法,否则就像上面的代码一样,得不到的期望的结果。

:文章的代码摘自 Thinking in Java(Fourth Edition)英文版,作者 [美]Bruce Eckef,刘中兵 评注。