博客 / 詳情

返回

#保姆級教學# Object 類結構的剖析(常用類)【附源碼】

java.lang.Object類

1.Object類是所有Java類的根父類
2.如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為java.lang.Object類
3.Object類中的功能(屬性、方法)就具有通用性。

屬性:無

方法:equals() / toString() 
     getClass() 
     hashCode() 
     clone() / finalize()
     wait() 、 notify()、notifyAll()

4.Object類只聲明瞭一個空參的構造器

Order order = new Order();
System.out.println(order.getClass().getSuperclass());

面試題:final、finally、finalize的區別?

面試題: == 和 equals() 區別

\== :運算符(可以使用在基本數據類型變量和引用數據類型變量中)

如果比較的是基本數據類型變量:比較兩個變量保存的數據是否相等。(不一定類型要相同)(自動類型提升)
如果比較的是引用數據類型變量:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體

補充: == 符號使用時,必須保證符號左右兩邊的變量類型一致。

我們對以上內容實際測試如下:

引用類型:
        Customer cust1 = new Customer("Tom",21);
        Customer cust2 = new Customer("Tom",21);
        System.out.println(cust1 == cust2);//false
        
        String str1 = new String("atguigu");
        String str2 = new String("atguigu");
        System.out.println(str1 == str2);//false

equals()方法的使用

1. 是一個方法,而非運算符,只能適用於引用數據類型。
2. Object類中equals()的定義:
        public boolean equals(Object obj) {
                return (this == obj);
        }
説明:Object類中定義的equals()和==的作用是相同的:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體

3.像String、Date、File、包裝類等都重寫了Object類中的equals()方法。
重寫以後,比較的不是兩個引用的地址是否相同,而是比較兩個對象的"實體內容"是否相同。

4.通常情況下,我們自定義的類如果使用equals()的話,也通常是比較兩個對象的"實體內容"是否相同。那麼,我們就需要對Object類中
的equals()進行重寫.

重寫的原則:比較兩個對象的實體內容是否相同.

\================================================================

equals()方法:
        System.out.println(cust1.equals(cust2));//false--->true 多態無處不在(形參object,這裏是其子類)
        System.out.println(str1.equals(str2));//true   重寫了Object類中的equals()方法

1、自動生成的equals()     目前已經掌握了------>生成構造方法、生成get()和set()方法、生成equals()和hash()
2、手動實現equals()的重寫

    @Override  //自動生成的equals()
    public boolean equals(Object obj) {  //Object obj  多態無處不在
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
            
        //正式比較
        Customer other = (Customer) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    重寫的原則:比較兩個對象的實體內容(即:name和age)是否相同
    手動實現equals()的重寫
    
    @Override
    public boolean equals(Object obj) {

//      System.out.println("Customer equals()....重寫的方法執行了");
        if (this == obj) {
            return true;
        }

        if(obj instanceof Customer){
            Customer cust = (Customer)obj;
            //比較兩個對象的每個屬性是否都相同
//          if(this.age == cust.age && this.name.equals(cust.name)){
//              return true;
//          }else{
//              return false;
//          }

            //或
            return this.age == cust.age && this.name.equals(cust.name);
            //基本數據類型age只能用==    引用數據類型name只能用equals()方法
        }else{
            return false;

        }

    }

Object類中toString()的使用

1、當我們輸出一個對象的引用時,實際上就是調用當前對象的toString()

Customer cust1 = new Customer("Tom",21);    //com.atguigu.java1.Customer@15db9742
System.out.println(cust1.toString());       //com.atguigu.java1.Customer@15db9742
System.out.println(cust1);


2、Object類中toString()的定義:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

3、像String、Date、File、包裝類等都重寫了Object類中的toString()方法。
使得在調用對象的toString()時,返回"實體內容"信息

4、自定義類也可以重寫toString()方法,當調用此方法時,返回對象的"實體內容"

手動實現

@Override
public String toString() {
    return "Customer[name = " + name + ",age = " + age + "]"; 
}

自動實現
@Override
public String toString() {
    return "Customer [name=" + name + ", age=" + age + "]";
}

Java中的JUnit單元測試

hamcrest-core-1.3.jar
下載43KB的jar包就可以

此單元測試方法上需要聲明註解:@Test,並在單元測試類中導入:import org.junit.Test;

聲明好單元測試方法以後,就可以在方法體內測試相關的代碼。

1.如果執行結果沒有任何異常:綠條
2.如果執行結果出現異常:紅條

包裝類(Wrapper)的使用

1、java提供了8種基本數據類型對應的包裝類,使得基本數據類型的變量具有類的特徵

總結:基本類型、包裝類與String類間的轉換
2、基本數據類型、包裝類、String三者之間的相互轉換

總結:(只看這個就可以了)

1、JDK 5.0 新特性:自動裝箱 與自動拆箱
        int num2 = 10;
        Integer in1 = num2;//自動裝箱
        int num3 = in1;//自動拆箱
        
2、基本數據類型、包裝類--->String類型:調用String重載的valueOf(Xxx xxx)
        float f1 = 12.3f;
        String str2 = String.valueOf(f1);//"12.3"
        
3、String類型 --->基本數據類型、包裝類:調用包裝類的parseXxx(String s)
        String str1 = "123";
        int num2 = Integer.parseInt(str1);
        System.out.println(num2 + 1);  //124
======================================================================================================
基本數據類型、包裝類--->String類型:調用String重載的valueOf(Xxx xxx)

    @Test
    public void test4(){
        
        int num1 = 10;
        //方式1:連接運算
        String str1 = num1 + "";
        //方式2:調用String的valueOf(Xxx xxx)
        float f1 = 12.3f;
        String str2 = String.valueOf(f1);//"12.3"
        
        Double d1 = new Double(12.4);
        String str3 = String.valueOf(d1);
        System.out.println(str2);
        System.out.println(str3);//"12.4"
        
    }
    
String類型 --->基本數據類型、包裝類:調用包裝類的parseXxx(String s)
    @Test
    public void test5(){
        String str1 = "123";
        //錯誤的情況:
//      int num1 = (int)str1;
//      Integer in1 = (Integer)str1;
        //可能會報NumberFormatException
        int num2 = Integer.parseInt(str1);
        System.out.println(num2 + 1);
        
        String str2 = "true1";
        boolean b1 = Boolean.parseBoolean(str2);
        System.out.println(b1);
    }

JDK 5.0 新特性:自動裝箱 與自動拆箱

    @Test
    public void test3(){
//      int num1 = 10;
//      //基本數據類型-->包裝類的對象
//      method(num1);
        
        //自動裝箱:基本數據類型 --->包裝類
        int num2 = 10;
        Integer in1 = num2;//自動裝箱
        
        boolean b1 = true;
        Boolean b2 = b1;//自動裝箱
        
        //自動拆箱:包裝類--->基本數據類型
        System.out.println(in1.toString());
        int num3 = in1;//自動拆箱   
    }
    
    public void method(Object obj){
        System.out.println(obj);
    }


基本數據類型 --->包裝類:調用包裝類的構造器

        int num1 = 10;
//      System.out.println(num1.toString());   error
        Integer in1 = new Integer(num1);
        System.out.println(in1.toString());  //10
        
        Integer in2 = new Integer("123");
        System.out.println(in2.toString());   //123
        //報異常       NumberFormatException: For input string: "123abc"
//      Integer in3 = new Integer("123abc");
//      System.out.println(in3.toString());
//=======================================================
        Float f1 = new Float(12.3f);
        Float f2 = new Float("12.3");
        System.out.println(f1);  //12.3
        System.out.println(f2);  //12.3
//=======================================================
        Boolean b1 = new Boolean(true);
        Boolean b2 = new Boolean("TrUe");
        System.out.println(b2);   //true
        Boolean b3 = new Boolean("true123");
        System.out.println(b3);//false      布爾類型特別一點:優化過

包裝類--->基本數據類型:調用包裝類Xxx的xxxValue()

    @Test
    public void test2(){
        Integer in1 = new Integer(12);
        
        int i1 = in1.intValue();
        System.out.println(i1 + 1);
        
        
        Float f1 = new Float(12.3);
        float f2 = f1.floatValue();
        System.out.println(f2 + 1);
    }

面試題

    @Test
    public void test1() {
        Object o1 = true ? new Integer(1) : new Double(2.0);
        System.out.println(o1);// 1.0

    }
    
    @Test    //為什麼??
    public void test2() {
        Object o2;
        if (true)
            o2 = new Integer(1);
        else
            o2 = new Double(2.0);
        System.out.println(o2);// 1

    }
    
    @Test
    public void test3() {
        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j);//false
    
        
Integer內部定義了IntegerCache結構(內部類),IntegerCache中定義了Integer[],
保存了從-128~127範圍的整數。如果我們使用自動裝箱的方式,給Integer賦值的範圍在-128~127範圍內時,
可以直接使用數組中的元素,不用再去new了。
目的:提高效率
        @Test
        Integer m = 1;
        Integer n = 1;
        System.out.println(m == n);//true

        Integer x = 128;//相當於new了一個Integer對象
        Integer y = 128;//相當於new了一個Integer對象
        System.out.println(x == y);//false
    }

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.