1. 程式人生 > >菜雞的Java筆記 Object 類

菜雞的Java筆記 Object 類

Object 類
        Object類 的主要作用
        Object 類的常用方法
        
    內容
        雖然有了物件的向上轉型,可以解決了引數的統一問題,但是面對JAVA 開發之中如此眾多的開發類
        所以現在就面臨這樣一個問題:引數型別怎麼選擇才能夠儲存所以的類物件呢?
        為此java裡面考慮到了此種情況有一個Object類
        此類定義:public class Object
        可以發現在整個對的java裡面只有Object 類的定義的時候沒有定義父類,而其他的所有類都是Object類的子類
        也就是說在整個java之中,除了Object類之外,一切都存在有繼承關係
        
        理論上定義一個類的時候如果沒有繼承任何的父類,那麼其將預設繼承Object類
        這樣的直接好處就是,所以類的物件都可以使用Object來接收
        範例:利用Object接收物件

class Person{
    
}
public class objectclass{
    public static void main(String args[]){
    Object obj = new Person();// 向上轉型    
    }
}

           
            利用Object可以實現最終的引數型別的統一
            
        清楚了 Object 類的作用之後,下面要完善一些操作:
            在簡單java類的時候需要提供有一個 getInfo() 的方法以返回物件資訊
            在進行簡單java類物件比較的時候準備有一個 compare() 方法進行比較
        那麼從現在開始以上的這兩個方法需要換名,在 Object 類裡面定義有一下的兩個匹配方法
            取得物件資訊: public String toString()

;
            物件比較: public boolean equals(Object obj);
            
    取得物件資訊
        如果說現在直接輸出一個物件,預設輸出的是一個物件的地址編碼
        範例:觀察預設的 toString    

class Person{
    
}
public class objectclass{
    public static void main(String args[]){
    Person p = new Person();
    System.out.println(p);
    System.out.println(p.toString);
    }
}

           
            通過此程式碼可以發現,在預設情況下如果要輸出一個物件都會執行 toString()方法,不管是否顯式呼叫此方法
            於是 Object 類對於此方法就有了一個自己的預設實現,雖然不知道每個物件輸出時都需要那些,但是至少知道每個物件存在都會有一個地址編碼
            所以預設的輸出內容就是物件的編碼資訊
            如果使用者現在不希望輸出編碼,而希望輸出具體的內容,則可以進行方法的覆寫
        範例:覆寫 toString() 方法

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "姓名:"+this.name+";年齡:"+this.age;
    }
}

public class objectclass{
    public static void main(String args[]){ // 為了方便模擬化呼叫
        Person p = new Person("楓",20);
        System.out.println(p);
        
    }
}


    物件比較:equals()
        物件比較在之前曾經使用過compare()方法進行表示,而且最為重要的是在之前實現物件比較時比較的流程:地址是否為空,屬性是否相同
        範例:實現物件比較

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public boolean equals(Object obj){
        if(this == obj){// 地址相同
            return true;
        }
        if(obj == null){ // 沒得比
            return false;
        }
        if(!(obj instanceof Person)){
            return false;// 兩個物件沒關係
        }
        Person per= (Person)obj;
        if(this.name.equals(per,name)&&this.age == per.age){
            return true;
        }
        return false;
    }
    public String toString(){
        return "姓名:"+this.name+";年齡:"+this.age;
    }
}

public class objectclass{
    public static void main(String args[]){ // 為了方便模擬化呼叫
        Person p1 = new Person("楓",20);
        Person p2 = new Person("楓",20);
        System.out.println(p2); // 有BUG 如果傳進來的是字串就會出錯,所以以後有判斷就.....
        
    }
}

               
                以後開始,所編寫物件比較操作,都以 Object 類的 equals()方法為主

    Object 類可以接收一切引用型別
        java的引用型別包含:陣列,類,介面。現在已經證明了所有的類物件都可以使用 Object 進行接收
        可是陣列和介面,他們也可以被 Object接收
        範例:利用 Object接收陣列物件

public class objectclass{
    public static void main(String args[]){
        Object obj = new int[]{1,2,3};//利用Object接收整型陣列,向上轉型
        if(obj instanceof int[]){ // 物件是否是int陣列
            int data[] = (int[])obj;//向下轉型
            for(int x = 0;x<data.length;x++){
                System.out.println(data[x]);
            }
        }
    }
}                

               
        除了可以接收陣列之外,介面也可以接收
        範例:輔助概念

interface A{// 定義了一個介面
    public void ptintA();
}

interface B{
    public void ptintB();
}
class X implements A,B{
    public void ptintA(){
        System.out.println("AAAAAAAAAAAAAAA");
    }
    public void ptintB(){
        System.out.println("BBBBBBBBBBBBBBBB");
    }
}
public class Interface{
    public static void main(String args[]){
         A a = new X();//向上轉型
         B b = (B)a;// 雖然A與B沒有關係,但是X是B的子類
         b.ptintB();
    }
}


    按照以上的思路解決Object 接收介面物件的問題

interface A{// 定義了一個介面
    public void ptintA();
}
class X equals Object implements A{
    public void ptintA(){
        System.out.println("AAAAAAAAAAAAAAA");
    }
}
public class Interface{
    public static void main(String args[]){
         A a = new X();//向上轉型
         Object obj = a;// 向上轉型
         A temp = (A)obj; // 向下轉型
         temp.ptintA();
    }
}

           
            Object 所有引用型別都可以接收,對於 資料的統一性操作上更加方便了

    總結
        1.Object類是所有類的父類,可以接收所以引用資料型別
        2.Object類提供的 toString()與 equals()方法可以應用在簡單java類中