java中的Object對象

java把現實中的任何事物都當做一個對象(Object), Java是面向對象的。此處的Object在Java中被定義為一個頂級父類,它是任何類父類,我們可以顯示的繼承它,也可以隱式繼承,如以下實例:

public class Dog extends Object{

}
與

public class Dog{
 
}

完全等價。那么Object有什么樣的作用?為什么每個類要去繼承Object呢?首先來看一下Object中包含的2個常用方法。

  1.   equals(Object obj)
    
  2.   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));

    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,518評論 0 3
  • 我很認真的問了蔡老師一個問題 我:人這一輩子一定要結婚嗎? 蔡老師看了我很久 蔡老師說:玩一玩吧! 多麼意味深長的...
    Sundari沁舒閱讀 234評論 1 3
  • coding = utf-8
    穆弋閱讀 243評論 0 0