用來(lái)比較兩個(gè)操作元是否相等,這兩個(gè)操作元既可以是基本類(lèi)型,也可以是引用類(lèi)型。
代碼01:
/**
* Demo01.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* discription: 操作符“==”
*
* @author CoderDream
*
*/
public class Demo01 {
/**
* <pre>
* 操作符“==”用來(lái)比較兩個(gè)操作元是否相等,這兩個(gè)操作元既可以是基本類(lèi)型,也可以是引用類(lèi)型。
* </pre>
*/
public static void f1() {
int a1 = 1, a2 = 3;
boolean b1 = a1 == a2; // "=="的操作元為基本類(lèi)型,b1變量值為false
System.out.println(b1);
String str1 = "Hello", str2 = "World";
boolean b2 = str1 == str2; // "=="的操作元為引用類(lèi)型,b2變量值為false
System.out.println(b2);
}
/**
* <pre>
* 當(dāng)操作符“==”兩邊都是引用類(lèi)型時(shí),這兩個(gè)引用變量必須都引用同一個(gè)對(duì)象,結(jié)果才為true。
* </pre>
*/
public static void f2() {
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
Integer int3 = int1; // int3和int1引用同一個(gè)對(duì)象
int[] array1 = new int[1];
int[] array2 = new int[1];
int[] array3 = array1; // array3和array1引用同一個(gè)對(duì)象
System.out.println("int1==int2 is " + (int1 == int2));
System.out.println("int1==int3 is " + (int1 == int3));
System.out.println("array1==array2 is " + (array1 == array2));
System.out.println("array1==array3 is " + (array1 == array3));
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-----------f1()-----------");
Demo01.f1();
System.out.println("-----------f2()-----------");
Demo01.f2();
}
}
* Demo01.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* discription: 操作符“==”
*
* @author CoderDream
*
*/
public class Demo01 {
/**
* <pre>
* 操作符“==”用來(lái)比較兩個(gè)操作元是否相等,這兩個(gè)操作元既可以是基本類(lèi)型,也可以是引用類(lèi)型。
* </pre>
*/
public static void f1() {
int a1 = 1, a2 = 3;
boolean b1 = a1 == a2; // "=="的操作元為基本類(lèi)型,b1變量值為false
System.out.println(b1);
String str1 = "Hello", str2 = "World";
boolean b2 = str1 == str2; // "=="的操作元為引用類(lèi)型,b2變量值為false
System.out.println(b2);
}
/**
* <pre>
* 當(dāng)操作符“==”兩邊都是引用類(lèi)型時(shí),這兩個(gè)引用變量必須都引用同一個(gè)對(duì)象,結(jié)果才為true。
* </pre>
*/
public static void f2() {
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
Integer int3 = int1; // int3和int1引用同一個(gè)對(duì)象
int[] array1 = new int[1];
int[] array2 = new int[1];
int[] array3 = array1; // array3和array1引用同一個(gè)對(duì)象
System.out.println("int1==int2 is " + (int1 == int2));
System.out.println("int1==int3 is " + (int1 == int3));
System.out.println("array1==array2 is " + (array1 == array2));
System.out.println("array1==array3 is " + (array1 == array3));
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-----------f1()-----------");
Demo01.f1();
System.out.println("-----------f2()-----------");
Demo01.f2();
}
}
輸出結(jié)果:
-----------f1()-----------
false
false
-----------f2()-----------
int1==int2 is false
int1==int3 is true
array1==array2 is false
array1==array3 is true
false
false
-----------f2()-----------
int1==int2 is false
int1==int3 is true
array1==array2 is false
array1==array3 is true
2、操作符“==”與多態(tài)性
a、對(duì)于引用類(lèi)型變量,Java編譯器根據(jù)變量被顯式聲明的類(lèi)型去編譯。當(dāng)“==”用于比較引用類(lèi)型變量時(shí),“==”兩邊的變量被顯式聲明的類(lèi)型必須是同種類(lèi)型或有繼承關(guān)系,即位于繼承樹(shù)的同一個(gè)繼承分支上,否則編譯出錯(cuò)。
b、在運(yùn)行時(shí),Java 虛擬機(jī)將根據(jù)兩邊的引用變量實(shí)際引用的對(duì)象進(jìn)行比較。
假設(shè)有4個(gè)類(lèi)--Creature、Animal、Dog和Cat類(lèi),它們的繼承關(guān)系如圖所示:

代碼02:
/**
* Demo02.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
*
* <pre>
* 操作符“==”與多態(tài)性
* 1、對(duì)于引用類(lèi)型變量,Java編譯器根據(jù)變量被顯式聲明的類(lèi)型去編譯。當(dāng)“==”用于比較引用
* 類(lèi)型變量時(shí),“==”兩邊的變量被顯式聲明的類(lèi)型必須是同種類(lèi)型或有繼承關(guān)系,即位于
* 繼承樹(shù)的同一個(gè)繼承分支上,否則編譯出錯(cuò)。
* 2、在運(yùn)行時(shí),Java 虛擬機(jī)將根據(jù)兩邊的引用變量實(shí)際引用的對(duì)象進(jìn)行比較。
* </pre>
*
* @author CoderDream
*
*/
public class Demo02 {
/**
*
*/
public static void f1() {
Dog dog = new Dog(); // dog變量被聲明為Dog類(lèi)型
Creature creature = dog; // 變量creature和dog引用同一個(gè)Dog對(duì)象
Animal animal = new Cat(); // animal 變量被聲明為 Animal 類(lèi)型
System.out.println(dog == animal); // 合法,打印false
System.out.println(dog == creature);// 合法,打印false
}
/**
* <pre>
* 這里變量dog被聲明為Dog類(lèi)型,變量cat被聲明為Cat類(lèi)型,Dog類(lèi)和Cat類(lèi)之間沒(méi)有繼承關(guān)系,
* 因此這兩個(gè)變量不能用“==”比較。
* </pre>
*/
public static void f2() {
Dog dog = new Dog();
Cat cat = new Cat();
// System.out.println(dog == cat);// 編譯出錯(cuò)
}
/**
* @param args
*/
public static void main(String[] args) {
Demo02.f1();
}
}
class Creature {
}
class Animal extends Creature {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
* Demo02.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
*
* <pre>
* 操作符“==”與多態(tài)性
* 1、對(duì)于引用類(lèi)型變量,Java編譯器根據(jù)變量被顯式聲明的類(lèi)型去編譯。當(dāng)“==”用于比較引用
* 類(lèi)型變量時(shí),“==”兩邊的變量被顯式聲明的類(lèi)型必須是同種類(lèi)型或有繼承關(guān)系,即位于
* 繼承樹(shù)的同一個(gè)繼承分支上,否則編譯出錯(cuò)。
* 2、在運(yùn)行時(shí),Java 虛擬機(jī)將根據(jù)兩邊的引用變量實(shí)際引用的對(duì)象進(jìn)行比較。
* </pre>
*
* @author CoderDream
*
*/
public class Demo02 {
/**
*
*/
public static void f1() {
Dog dog = new Dog(); // dog變量被聲明為Dog類(lèi)型
Creature creature = dog; // 變量creature和dog引用同一個(gè)Dog對(duì)象
Animal animal = new Cat(); // animal 變量被聲明為 Animal 類(lèi)型
System.out.println(dog == animal); // 合法,打印false
System.out.println(dog == creature);// 合法,打印false
}
/**
* <pre>
* 這里變量dog被聲明為Dog類(lèi)型,變量cat被聲明為Cat類(lèi)型,Dog類(lèi)和Cat類(lèi)之間沒(méi)有繼承關(guān)系,
* 因此這兩個(gè)變量不能用“==”比較。
* </pre>
*/
public static void f2() {
Dog dog = new Dog();
Cat cat = new Cat();
// System.out.println(dog == cat);// 編譯出錯(cuò)
}
/**
* @param args
*/
public static void main(String[] args) {
Demo02.f1();
}
}
class Creature {
}
class Animal extends Creature {
}
class Dog extends Animal {
}
class Cat extends Animal {
}
輸出結(jié)果:
false
true
true
3、操作符“==”用于數(shù)組類(lèi)型
數(shù)組類(lèi)型也是引用類(lèi)型,可以用“==”進(jìn)行比較
代碼03:
/**
* Demo03.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* <pre>
* 操作符“==”用于數(shù)組類(lèi)型
* </pre>
*
* @author CoderDream
*
*/
public class Demo03 {
/**
* <pre>
* 數(shù)組類(lèi)型也是引用類(lèi)型,可以用“==”進(jìn)行比較
* </pre>
*/
public static void f1() {
// boolean b1 = new int[4] == new long[5];//編譯出錯(cuò),兩邊類(lèi)型不一致
boolean b2 = new int[4] == new int[4];// 合法,b2的值為false
System.out.println(b2);
int[] array1 = new int[4];
int[] array2 = array1;
boolean b3 = array1 == array2; // 合法,b3的值為true
System.out.println(b3);
}
/**
* @param args
*/
public static void main(String[] args) {
Demo03.f1();
}
}
* Demo03.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* <pre>
* 操作符“==”用于數(shù)組類(lèi)型
* </pre>
*
* @author CoderDream
*
*/
public class Demo03 {
/**
* <pre>
* 數(shù)組類(lèi)型也是引用類(lèi)型,可以用“==”進(jìn)行比較
* </pre>
*/
public static void f1() {
// boolean b1 = new int[4] == new long[5];//編譯出錯(cuò),兩邊類(lèi)型不一致
boolean b2 = new int[4] == new int[4];// 合法,b2的值為false
System.out.println(b2);
int[] array1 = new int[4];
int[] array2 = array1;
boolean b3 = array1 == array2; // 合法,b3的值為true
System.out.println(b3);
}
/**
* @param args
*/
public static void main(String[] args) {
Demo03.f1();
}
}
輸出結(jié)果:
false
true
true
4、equals() 方法
equals() 方法是在 Object 類(lèi)中定義的方法,它的聲明格式如下:
public boolean equals(Object obj)
Object 類(lèi)的 equals() 方法的比較規(guī)則為:當(dāng)參數(shù) obj 引用的對(duì)象與當(dāng)前對(duì)象為同一個(gè)對(duì)象時(shí),就返回true,否則返回false。 在JDK中有一些類(lèi)覆蓋了 Object 類(lèi)的equal()方法,它們的比較規(guī)則為:
如果兩個(gè)對(duì)象的類(lèi)型一致,并且內(nèi)容一致,則返回true。
這些類(lèi)包括:java.io.File、java.util.Date、java.lang.String、包裝類(lèi)(如java.lang.Integer和java.lang.Double類(lèi))。
代碼04:
/**
* Demo04.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* @author CoderDream
*
*/
public class Demo04 {
/**
* <pre>
* equals() 方法是在 Object 類(lèi)中定義的方法,它的聲明格式如下:
* public boolean equals(Object obj)
* Object 類(lèi)的 equals() 方法的比較規(guī)則為:當(dāng)參數(shù) obj 引用的對(duì)象與當(dāng)前對(duì)象為
* 同一個(gè)對(duì)象時(shí),就返回true,否則返回false。
* </pre>
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else {
return false;
}
}
/**
* <pre>
* 1、a1和a2變量引用不同的對(duì)象,因此用“==”或 equals() 方法比較的結(jié)果都為 false;
* 2、a1和a3變量都引用同一個(gè)Dog對(duì)象,因此用“==”或equals()方法比較的結(jié)果都為true;
* </pre>
*/
public static void f1() {
Animal a1 = new Dog();
Animal a2 = new Cat();
Animal a3 = a1;
System.out.println(a1 == a2); // 打印false
System.out.println(a1.equals(a2)); // 打印false
System.out.println(a1 == a3); // 打印true
System.out.println(a1.equals(a3)); // 打印true
}
/**
* <pre>
* 在JDK中有一些類(lèi)覆蓋了 Object 類(lèi)的equal()方法,它們的比較規(guī)則為:
* 如果兩個(gè)對(duì)象的類(lèi)型一致,并且內(nèi)容一致,則返回true。
* 這些類(lèi)包括:java.io.File、java.util.Date、java.lang.String、
* 包裝類(lèi)(如java.lang.Integer和java.lang.Double類(lèi))。
* </pre>
*/
public static void f2() {
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(int1 == int2); // 打印false
System.out.println(int1.equals(int2)); // 打印true
System.out.println(str1 == str2); // 打印false
System.out.println(str1.equals(str2)); // 打印true
}
/**
* <pre>
* Boolean 類(lèi)是包裝類(lèi),只要兩個(gè)Boolean對(duì)象的布爾值內(nèi)容一樣,
* equals()方法的比較結(jié)果就為true。
* </pre>
*/
public static void f3() {
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean(true);
if (b1 == b2) {
if (b1.equals(b2)) {
System.out.println("a");
} else {
System.out.println("b");
}
} else {
if (b1.equals(b2)) {
System.out.println("c"); // 執(zhí)行這段代碼
} else {
System.out.println("d");
}
}
}
/**
* <pre>
* b1和obj1被聲明為不同的類(lèi)型,但它們實(shí)際引用的是同一個(gè)Dog對(duì)象,
* 因此用“==”或equals()方法比較的結(jié)果都為true。
* </pre>
*/
public static void f4() {
Boolean b1 = new Boolean(true);
Object obj1 = (Object) b1;
if (b1 == obj1) {
if (b1.equals(obj1)) {
System.out.println("a"); // 執(zhí)行這段代碼
} else {
System.out.println("b");
}
} else {
if (b1.equals(obj1)) {
System.out.println("c");
} else {
System.out.println("d");
}
}
}
/**
* <pre>
* Float 和 Double 類(lèi)型是包裝類(lèi)型,只要兩個(gè) Float 對(duì)象或兩個(gè) Double對(duì)象的內(nèi)容一樣,
* equals()方法比較的結(jié)果就為true。
* </pre>
*/
public static void f5() {
Float f1 = new Float("10F");
Float f2 = new Float("10F");
Double d1 = new Double("10D");
System.out.println(f1 == f2); // 打印false
System.out.println(f1.equals(f2)); // 打印true
System.out.println(f1.equals(d1)); // 打印false,因?yàn)閒2和d1不是相同類(lèi)型
System.out.println(f1.equals(new Float("10"))); // 打印true
}
/**
* <pre>
* 例如以下變量a和b引用不同的String對(duì)象,但它們包含的內(nèi)容都是“helle”,
* 所以a.equals(b)的結(jié)果為true;
* 而變量c是字符串?dāng)?shù)組類(lèi)型,因此a.equals(c)的結(jié)果為false。
* </pre>
*/
public static void f6() {
String a = "hello";
String b = new String(a);
char[] c = { 'h', 'e', 'l', 'l', 'o' };
System.out.println(a == "hello"); // 打印true
System.out.println(a == b); // 打印false
System.out.println(a.equals(b)); // 打印true
System.out.println(a.equals(c)); // 打印false
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("----------f1()------------");
Demo04.f1();
System.out.println("----------f2()------------");
Demo04.f2();
System.out.println("----------f3()------------");
Demo04.f3();
System.out.println("----------f4()------------");
Demo04.f4();
System.out.println("----------f5()------------");
Demo04.f5();
System.out.println("----------f6()------------");
Demo04.f6();
}
}
* Demo04.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* @author CoderDream
*
*/
public class Demo04 {
/**
* <pre>
* equals() 方法是在 Object 類(lèi)中定義的方法,它的聲明格式如下:
* public boolean equals(Object obj)
* Object 類(lèi)的 equals() 方法的比較規(guī)則為:當(dāng)參數(shù) obj 引用的對(duì)象與當(dāng)前對(duì)象為
* 同一個(gè)對(duì)象時(shí),就返回true,否則返回false。
* </pre>
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else {
return false;
}
}
/**
* <pre>
* 1、a1和a2變量引用不同的對(duì)象,因此用“==”或 equals() 方法比較的結(jié)果都為 false;
* 2、a1和a3變量都引用同一個(gè)Dog對(duì)象,因此用“==”或equals()方法比較的結(jié)果都為true;
* </pre>
*/
public static void f1() {
Animal a1 = new Dog();
Animal a2 = new Cat();
Animal a3 = a1;
System.out.println(a1 == a2); // 打印false
System.out.println(a1.equals(a2)); // 打印false
System.out.println(a1 == a3); // 打印true
System.out.println(a1.equals(a3)); // 打印true
}
/**
* <pre>
* 在JDK中有一些類(lèi)覆蓋了 Object 類(lèi)的equal()方法,它們的比較規(guī)則為:
* 如果兩個(gè)對(duì)象的類(lèi)型一致,并且內(nèi)容一致,則返回true。
* 這些類(lèi)包括:java.io.File、java.util.Date、java.lang.String、
* 包裝類(lèi)(如java.lang.Integer和java.lang.Double類(lèi))。
* </pre>
*/
public static void f2() {
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(int1 == int2); // 打印false
System.out.println(int1.equals(int2)); // 打印true
System.out.println(str1 == str2); // 打印false
System.out.println(str1.equals(str2)); // 打印true
}
/**
* <pre>
* Boolean 類(lèi)是包裝類(lèi),只要兩個(gè)Boolean對(duì)象的布爾值內(nèi)容一樣,
* equals()方法的比較結(jié)果就為true。
* </pre>
*/
public static void f3() {
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean(true);
if (b1 == b2) {
if (b1.equals(b2)) {
System.out.println("a");
} else {
System.out.println("b");
}
} else {
if (b1.equals(b2)) {
System.out.println("c"); // 執(zhí)行這段代碼
} else {
System.out.println("d");
}
}
}
/**
* <pre>
* b1和obj1被聲明為不同的類(lèi)型,但它們實(shí)際引用的是同一個(gè)Dog對(duì)象,
* 因此用“==”或equals()方法比較的結(jié)果都為true。
* </pre>
*/
public static void f4() {
Boolean b1 = new Boolean(true);
Object obj1 = (Object) b1;
if (b1 == obj1) {
if (b1.equals(obj1)) {
System.out.println("a"); // 執(zhí)行這段代碼
} else {
System.out.println("b");
}
} else {
if (b1.equals(obj1)) {
System.out.println("c");
} else {
System.out.println("d");
}
}
}
/**
* <pre>
* Float 和 Double 類(lèi)型是包裝類(lèi)型,只要兩個(gè) Float 對(duì)象或兩個(gè) Double對(duì)象的內(nèi)容一樣,
* equals()方法比較的結(jié)果就為true。
* </pre>
*/
public static void f5() {
Float f1 = new Float("10F");
Float f2 = new Float("10F");
Double d1 = new Double("10D");
System.out.println(f1 == f2); // 打印false
System.out.println(f1.equals(f2)); // 打印true
System.out.println(f1.equals(d1)); // 打印false,因?yàn)閒2和d1不是相同類(lèi)型
System.out.println(f1.equals(new Float("10"))); // 打印true
}
/**
* <pre>
* 例如以下變量a和b引用不同的String對(duì)象,但它們包含的內(nèi)容都是“helle”,
* 所以a.equals(b)的結(jié)果為true;
* 而變量c是字符串?dāng)?shù)組類(lèi)型,因此a.equals(c)的結(jié)果為false。
* </pre>
*/
public static void f6() {
String a = "hello";
String b = new String(a);
char[] c = { 'h', 'e', 'l', 'l', 'o' };
System.out.println(a == "hello"); // 打印true
System.out.println(a == b); // 打印false
System.out.println(a.equals(b)); // 打印true
System.out.println(a.equals(c)); // 打印false
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("----------f1()------------");
Demo04.f1();
System.out.println("----------f2()------------");
Demo04.f2();
System.out.println("----------f3()------------");
Demo04.f3();
System.out.println("----------f4()------------");
Demo04.f4();
System.out.println("----------f5()------------");
Demo04.f5();
System.out.println("----------f6()------------");
Demo04.f6();
}
}
輸出結(jié)果:
----------f1()------------
false
false
true
true
----------f2()------------
false
true
false
true
----------f3()------------
c
----------f4()------------
a
----------f5()------------
false
true
false
true
----------f6()------------
true
false
true
false
false
false
true
true
----------f2()------------
false
true
false
true
----------f3()------------
c
----------f4()------------
a
----------f5()------------
false
true
false
true
----------f6()------------
true
false
true
false
5、在用戶自定義的類(lèi)中也可以覆蓋Object類(lèi)的equals()方法,重新定義比較規(guī)則。
代碼05:
/**
* Demo05.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* @author CoderDream
*
*/
public class Demo05 {
/**
* @param args
*/
public static void main(String[] args) {
Person p1 = new Person("Tom");
Person p2 = new Person("Tom");
System.out.println(p1 == p2); // 打印 false
System.out.println(p1.equals(p2)); // 打印 true
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object o) {
if (this == o) {
return true;
}
final Person other = (Person) o;
if (this.name.equals(other.name)) {
return true;
} else {
return false;
}
}
}
* Demo05.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* @author CoderDream
*
*/
public class Demo05 {
/**
* @param args
*/
public static void main(String[] args) {
Person p1 = new Person("Tom");
Person p2 = new Person("Tom");
System.out.println(p1 == p2); // 打印 false
System.out.println(p1.equals(p2)); // 打印 true
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object o) {
if (this == o) {
return true;
}
final Person other = (Person) o;
if (this.name.equals(other.name)) {
return true;
} else {
return false;
}
}
}
輸出結(jié)果:
false
true
true
6、 instanceof操作符
instanceof操作符用于判斷一個(gè)引用類(lèi)型所引用的對(duì)象是否是一個(gè)類(lèi)的實(shí)例。
instanceof操作符左邊的操作元是一個(gè)引用類(lèi)型,右邊的操作元是一個(gè)類(lèi)名或接口名。
形式如下:
obj instanceof ClassName
或者:

例如:
Dog dog = new Dog();
Systom.out.println(dog instanceof XXX);//XXX表示一個(gè)類(lèi)名或接口名
Systom.out.println(dog instanceof XXX);//XXX表示一個(gè)類(lèi)名或接口名
一個(gè)類(lèi)的實(shí)例包括類(lèi)本身的實(shí)例,以及所有直接或間接的子類(lèi)的實(shí)例,因此當(dāng)"XXX"是以下
值時(shí),instanceof 表達(dá)式的值為true。
● Dog類(lèi)
● Dog類(lèi)的直接或間接父類(lèi)
● Dog類(lèi)實(shí)現(xiàn)的接口,已經(jīng)所有父類(lèi)實(shí)現(xiàn)的接口。
代碼06:
/**
* Demo06.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* <pre>
* instanceof操作符用于判斷一個(gè)引用類(lèi)型所引用的對(duì)象是否是一個(gè)類(lèi)的實(shí)例。
* instanceof操作符左邊的操作元是一個(gè)引用類(lèi)型,右邊的操作元是一個(gè)類(lèi)名或接口名。
* 形式如下:
* obj instanceof ClassName
* 或者:
* obj instanceof InterfaceName
* 例如:
* Dog dog = new Dog();
* Systom.out.println(dog instanceof XXX);//XXX表示一個(gè)類(lèi)名或接口名
*
* 一個(gè)類(lèi)的實(shí)例包括類(lèi)本身的實(shí)例,以及所有直接或間接的子類(lèi)的實(shí)例,因此當(dāng)"XXX"是以下
* 值時(shí),instanceof 表達(dá)式的值為true。
* ● Dog類(lèi)
* ● Dog類(lèi)的直接或間接父類(lèi)
* ● Dog類(lèi)實(shí)現(xiàn)的接口,已經(jīng)所有父類(lèi)實(shí)現(xiàn)的接口。
* </pre>
*
*
* @author CoderDream
*
*/
public class Demo06 {
/**
* <pre>
* 由于Animal是Dog的直接父類(lèi),Creature類(lèi)和Object類(lèi)是Dog的間接父類(lèi),
* 因此以下 instanceof 表達(dá)式的值為true。
* </pre>
*/
public static void f1() {
Dog dog = new Dog();
System.out.println(dog instanceof Dog); // 打印 true
System.out.println(dog instanceof Animal); // 打印 true
System.out.println(dog instanceof Creature); // 打印 true
System.out.println(dog instanceof Object); // 打印 true
}
/**
* <pre>
* instanceof 右邊的操作元也可以是接口名。
* </pre>
*/
public static void f2() {
B b = new B();
System.out.println(b instanceof I); // 打印 true
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-----------f1()-----------");
Demo06.f1();
System.out.println("-----------f2()-----------");
Demo06.f2();
}
}
interface I {
}
class A implements I {
}
class B extends A {
}
* Demo06.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* <pre>
* instanceof操作符用于判斷一個(gè)引用類(lèi)型所引用的對(duì)象是否是一個(gè)類(lèi)的實(shí)例。
* instanceof操作符左邊的操作元是一個(gè)引用類(lèi)型,右邊的操作元是一個(gè)類(lèi)名或接口名。
* 形式如下:
* obj instanceof ClassName
* 或者:
* obj instanceof InterfaceName
* 例如:
* Dog dog = new Dog();
* Systom.out.println(dog instanceof XXX);//XXX表示一個(gè)類(lèi)名或接口名
*
* 一個(gè)類(lèi)的實(shí)例包括類(lèi)本身的實(shí)例,以及所有直接或間接的子類(lèi)的實(shí)例,因此當(dāng)"XXX"是以下
* 值時(shí),instanceof 表達(dá)式的值為true。
* ● Dog類(lèi)
* ● Dog類(lèi)的直接或間接父類(lèi)
* ● Dog類(lèi)實(shí)現(xiàn)的接口,已經(jīng)所有父類(lèi)實(shí)現(xiàn)的接口。
* </pre>
*
*
* @author CoderDream
*
*/
public class Demo06 {
/**
* <pre>
* 由于Animal是Dog的直接父類(lèi),Creature類(lèi)和Object類(lèi)是Dog的間接父類(lèi),
* 因此以下 instanceof 表達(dá)式的值為true。
* </pre>
*/
public static void f1() {
Dog dog = new Dog();
System.out.println(dog instanceof Dog); // 打印 true
System.out.println(dog instanceof Animal); // 打印 true
System.out.println(dog instanceof Creature); // 打印 true
System.out.println(dog instanceof Object); // 打印 true
}
/**
* <pre>
* instanceof 右邊的操作元也可以是接口名。
* </pre>
*/
public static void f2() {
B b = new B();
System.out.println(b instanceof I); // 打印 true
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-----------f1()-----------");
Demo06.f1();
System.out.println("-----------f2()-----------");
Demo06.f2();
}
}
interface I {
}
class A implements I {
}
class B extends A {
}
輸出結(jié)果:
-----------f1()-----------
true
true
true
true
-----------f2()-----------
true
true
true
true
true
-----------f2()-----------
true
7、 instanceof 與多態(tài)性
對(duì)于引用類(lèi)型變量,Java 編譯器只根據(jù)變量被先生聲明的類(lèi)去編譯。
instanceof 左邊操作元被顯式聲明的類(lèi)型與右邊操作元必須是同種類(lèi)或者有繼承關(guān)系,即位于繼承樹(shù)的同一個(gè)繼承分支上,否則編譯出錯(cuò)。
Dog dog = new Dog();
System.out.println(dog instanceof Cat); // 編譯出錯(cuò)
Cat cat = new Cat();
System.out.println(cat instanceof Dog); // 編譯出錯(cuò)
System.out.println(dog instanceof Cat); // 編譯出錯(cuò)
Cat cat = new Cat();
System.out.println(cat instanceof Dog); // 編譯出錯(cuò)
instanceof 用于數(shù)組類(lèi)型
boolean b1 = new int[4] instanceof long[]; // 編譯出錯(cuò),兩邊操作元類(lèi)型不一致
boolean b2 = new int[4] instanceof int[]; // 合法,b2的值為true
boolean b2 = new int[4] instanceof int[]; // 合法,b2的值為true
代碼07:
/**
* Demo07.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* <pre>
* instanceof 與多態(tài)性
* 對(duì)于引用類(lèi)型變量,Java 編譯器只根據(jù)變量被先生聲明的類(lèi)去編譯。
* instanceof 左邊操作元被顯式聲明的類(lèi)型與右邊操作元必須是同種類(lèi)或者有繼承關(guān)系,
* 即位于繼承樹(shù)的同一個(gè)繼承分支上,否則編譯出錯(cuò)。
* Dog dog = new Dog();
* System.out.println(dog instanceof Cat); // 編譯出錯(cuò)
*
* Cat cat = new Cat();
* System.out.println(cat instanceof Dog); // 編譯出錯(cuò)
*
* instanceof 用于數(shù)組類(lèi)型
* boolean b1 = new int[4] instanceof long[]; // 編譯出錯(cuò),兩邊操作元類(lèi)型不一致
* boolean b2 = new int[4] instanceof int[]; // 合法,b2的值為true
* </pre>
*
* @author CoderDream
*
*/
public class Demo07 {
/**
* <pre>
* 在運(yùn)行時(shí),將根據(jù)左邊操作元實(shí)際引用的對(duì)象來(lái)判斷。
* </pre>
*/
public static void f1() {
Animal a = new Dog(); // a 變量被聲明為Animal類(lèi)型,引用Dog對(duì)象
System.out.println(a instanceof Animal); // 合法, 打印true
System.out.println(a instanceof Dog); // 合法, 打印true
System.out.println(a instanceof Cat); // 合法, 打印false
}
/**
* <pre>
* 假定Animal類(lèi)是非抽象類(lèi),允許實(shí)例化,
*
* </pre>
*/
public static void f2() {
System.out.println((new Demo07()).isInstanceOfAnimal(new Dog())); // 打印fasle
System.out.println((new Demo07()).isInstanceOfAnimal(new Cat())); // 打印fasle
System.out.println((new Demo07()).isInstanceOfAnimal(new Animal())); // 打印true
System.out.println((new Demo07()).isInstanceOfAnimal(new Creature())); // 打印fasle
}
/**
* <pre>
* 假定Animal類(lèi)是非抽象類(lèi),允許實(shí)例化,以下判斷規(guī)則:
* 只有當(dāng)參數(shù) obj 引用 Animal 類(lèi)本身的實(shí)例,而不是它的子類(lèi)Dog或Cat多實(shí)例時(shí),
* 才返回true。
*
* 如果 obj instanceof Animal為true,那么obj有可能引用 Animal本身、Dog類(lèi)本身
* 或Cat類(lèi)本身的實(shí)例;
* 如果 obj instanceof Dog 和 obj instanceof Cat均為false,那么 obj 不會(huì)引用
* Dog類(lèi)本身或Cat類(lèi)本身的實(shí)例。
* 如果同時(shí)滿足這幾個(gè)條件,就可以得出 obj 引用 Animal 類(lèi)本身的實(shí)例的結(jié)論。
* </pre>
*
* @param obj
* @return
*/
public boolean isInstanceOfAnimal(Object obj) {
return obj instanceof Animal && !(obj instanceof Dog)
&& !(obj instanceof Cat);
}
/**
* <pre>
* instanceof 用于數(shù)組類(lèi)型
* </pre>
*/
public static void f3() {
// boolean b1 = new int[4] instanceof long[]; // 編譯出錯(cuò),兩邊操作元類(lèi)型不一致
boolean b2 = new int[4] instanceof int[]; // 合法,b2的值為true
System.out.println(b2);
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-----------f1()-----------");
Demo07.f1();
System.out.println("-----------f2()-----------");
Demo07.f2();
System.out.println("-----------f3()-----------");
Demo07.f3();
}
}
* Demo07.java
*
* Provider: CoderDream's Studio
*
* History
* Date(DD/MM/YYYY) Author Description
* ----------------------------------------------------------------------------
* Nov 13, 2007 CoderDream Created
*/
package com.coderdream.operator;
/**
* <pre>
* instanceof 與多態(tài)性
* 對(duì)于引用類(lèi)型變量,Java 編譯器只根據(jù)變量被先生聲明的類(lèi)去編譯。
* instanceof 左邊操作元被顯式聲明的類(lèi)型與右邊操作元必須是同種類(lèi)或者有繼承關(guān)系,
* 即位于繼承樹(shù)的同一個(gè)繼承分支上,否則編譯出錯(cuò)。
* Dog dog = new Dog();
* System.out.println(dog instanceof Cat); // 編譯出錯(cuò)
*
* Cat cat = new Cat();
* System.out.println(cat instanceof Dog); // 編譯出錯(cuò)
*
* instanceof 用于數(shù)組類(lèi)型
* boolean b1 = new int[4] instanceof long[]; // 編譯出錯(cuò),兩邊操作元類(lèi)型不一致
* boolean b2 = new int[4] instanceof int[]; // 合法,b2的值為true
* </pre>
*
* @author CoderDream
*
*/
public class Demo07 {
/**
* <pre>
* 在運(yùn)行時(shí),將根據(jù)左邊操作元實(shí)際引用的對(duì)象來(lái)判斷。
* </pre>
*/
public static void f1() {
Animal a = new Dog(); // a 變量被聲明為Animal類(lèi)型,引用Dog對(duì)象
System.out.println(a instanceof Animal); // 合法, 打印true
System.out.println(a instanceof Dog); // 合法, 打印true
System.out.println(a instanceof Cat); // 合法, 打印false
}
/**
* <pre>
* 假定Animal類(lèi)是非抽象類(lèi),允許實(shí)例化,
*
* </pre>
*/
public static void f2() {
System.out.println((new Demo07()).isInstanceOfAnimal(new Dog())); // 打印fasle
System.out.println((new Demo07()).isInstanceOfAnimal(new Cat())); // 打印fasle
System.out.println((new Demo07()).isInstanceOfAnimal(new Animal())); // 打印true
System.out.println((new Demo07()).isInstanceOfAnimal(new Creature())); // 打印fasle
}
/**
* <pre>
* 假定Animal類(lèi)是非抽象類(lèi),允許實(shí)例化,以下判斷規(guī)則:
* 只有當(dāng)參數(shù) obj 引用 Animal 類(lèi)本身的實(shí)例,而不是它的子類(lèi)Dog或Cat多實(shí)例時(shí),
* 才返回true。
*
* 如果 obj instanceof Animal為true,那么obj有可能引用 Animal本身、Dog類(lèi)本身
* 或Cat類(lèi)本身的實(shí)例;
* 如果 obj instanceof Dog 和 obj instanceof Cat均為false,那么 obj 不會(huì)引用
* Dog類(lèi)本身或Cat類(lèi)本身的實(shí)例。
* 如果同時(shí)滿足這幾個(gè)條件,就可以得出 obj 引用 Animal 類(lèi)本身的實(shí)例的結(jié)論。
* </pre>
*
* @param obj
* @return
*/
public boolean isInstanceOfAnimal(Object obj) {
return obj instanceof Animal && !(obj instanceof Dog)
&& !(obj instanceof Cat);
}
/**
* <pre>
* instanceof 用于數(shù)組類(lèi)型
* </pre>
*/
public static void f3() {
// boolean b1 = new int[4] instanceof long[]; // 編譯出錯(cuò),兩邊操作元類(lèi)型不一致
boolean b2 = new int[4] instanceof int[]; // 合法,b2的值為true
System.out.println(b2);
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("-----------f1()-----------");
Demo07.f1();
System.out.println("-----------f2()-----------");
Demo07.f2();
System.out.println("-----------f3()-----------");
Demo07.f3();
}
}
輸出結(jié)果:
-----------f1()-----------
true
true
false
-----------f2()-----------
false
false
true
false
-----------f3()-----------
true
true
true
false
-----------f2()-----------
false
false
true
false
-----------f3()-----------
true