java把現實中的任何事物都當做一個對象(Object), Java是面向對象的。此處的Object在Java中被定義為一個頂級父類,它是任何類父類,我們可以顯示的繼承它,也可以隱式繼承,如以下實例:
public class Dog extends Object{
}
與
public class Dog{
}
完全等價。那么Object有什么樣的作用?為什么每個類要去繼承Object呢?首先來看一下Object中包含的2個常用方法。
equals(Object obj)
toString()
其中的方法會被高頻率的使用,為了實現代碼復用,java 設計者就把這些常用的方法集中的放到了一個類中,這個類就是Object.
看equals之前需要先看下“==”,因為“==”是判斷相等,equals也是判斷相等,只是”==”主要用于判斷基本數據類型的相等性,當然也可以直接判斷兩個對象。而equals主要判斷對象內容。其中有很多細節,下面逐個說明:
先看“==”判斷基本數據類型
public static void main(String[] args) {
int i = 1;
int j = 1;
boolean flag0 = true;
boolean flag1 = false;
System.out.println("i==j:"+(i==j));
System.out.println("flag0==flag1:"+(flag0==flag1));
}
運行結果:
i==j:true
flag0==flag1:false
以上實例非常簡單,不多說明。
下面看一下對象的比較:
public static void main(String[] args) {
Dog dog0 = new Dog();
Dog dog1 = new Dog();
System.out.println(("dog0==dog1:")+(dog0==dog1));
}
運行結果:dog0==dog1:false
以上實例中的“==”,比較的是dog0的內存首地址和dog1 的內存首地址,由于dog0和dog1所指向的對象是在內存中開辟的兩個空間,所以首地址是不一樣的,此處打印輸出false.
那么有沒有辦法看到內存首地址是多少呢?
有句話是說“辦法總比問題多”,如果想看到內存首地址,我們需要再認識另外一個函數toString(),當我們直接打印某個對象引用的時候,該方法就會得到調用,看一個實例:
public static void main(String[] args) {
Dog dog0 = new Dog();
System.out.println(("dog0:")+dog0);
System.out.println(("dog0.toString():")+dog0.toString());
打印輸出:
dog0:Dog@6b97fd
dog0.toString():Dog@6b97fd
兩者完全等價,也就是說當我們直接打印輸出引用與在引用上調用toString方法兩者完全等價。
目前看到的Dog@6b97fd對我們來說沒有任何的意義,為了讓其變得有意義,我們可以對它進行重寫。比如以上實例打印dog引用時,把dog的dogName打印輸出,修改以上實例如下:
public class Dog{
private String dogName;
public String getDogName() {
return dogName;
}
public void setDogName(String dogName) {
this.dogName = dogName;
}
public String toString() {
return "dog's name is:"+dogName;
}
}
入口函數:
public class EqualsDemo {
public static void main(String[] args) {
Dog dog0 = new Dog();
dog0.setDogName("xiaobai");
System.out.println(("dog0:")+dog0);
}
}
打印輸出:dog0:dog's name is:xiaobai
在此有個特殊情況,如果直接定義兩個內容相同的String常量,兩者會指向同樣一個對象:
public static void main(String[] args) {
String str0 = "Hello";
String str1 = "Hello";
System.out.println("str0==str1"+(str0==str1));
}
打印輸出:str0==str1:true
但是如果通過new的方式產生了String常量,則不會指向同樣的對象,如一下實例:
public static void main(String[] args) {
String str0 = "Hello";
String str1 = new String("Hello");
System.out.println("str0==str1:"+(str0==str1));
}
運行程序,打印輸出:str0==str1:false
Equals 方法主要是比較對象內容,但是在默認情況下,比較的是內存首地址。看個實例:
創建兩個類:
public class Dog{
}
另外一個類:
public class EqualsDemo {
public static void main(String[] args) {
Dog dog0 = new Dog();
Dog dog1 = new Dog();
System.out.println(("dog0.equals(dog1):")+dog0.equals(dog1));
}
}
打印輸出:dog0.equals(dog1):false
可以通過覆蓋equals方法來比較兩個對象的內容
下面看一個equals使用的例子,該實例中想通過判斷dog 的名字,如果名字相等就認為兩個對象相等,如果名字不相等就認為兩個對象不相等。
public class Dog {
private String dogName;
public String getDogName() {
return dogName;
}
public void setDogName(String dogName) {
this.dogName = dogName;
}
public boolean equals(Object obj) {
if (obj == null)
return false;
Dog other = (Dog) obj;
if (dogName.equals(other.dogName)){
return true;
}else{
return false;
}
}
}
入口函數如下:
public static void main(String args[]){
Dog dog0 = new Dog();
dog0.setDogName("xiaobai");
Dog dog1 = new Dog();
dog1.setDogName("xiaobai");
System.out.println("dog0.equals(dog1):"+dog0.equals(dog1));
}