1. 程式人生 > >Java —— Object類

Java —— Object類

  • Object是Java預設提供的類

  • Java除了Object類,所有的類都存在繼承關係,預設會繼承Object父類,所有類物件都可以通過Object類進行接收。

1.取得物件資訊——toString( )

  • 直接使用物件輸出,預設輸出一個地址編碼;如果輸出的是String物件,此時輸出字串內容而非地址。

原因:String類覆寫了Object的toString( )方法

  • 系統輸出預設會呼叫物件的toString( )
  • 如果預設給出的toString( )功能不足(想要輸出本類資訊),需要在子類中覆寫toString( )方法。

程式碼示例:

public class ObjectTest1 {
    public static void main(String[] args) {
        fun(new Person("張三",25));   //覆寫前:[email protected]  覆寫後:姓名:張三  年齡:25
        fun("hello");   //hello
    }
    public static void fun(Object obj) {
        System.out.println(obj.toString());
        //等同於下行程式碼
        System.out.println(obj);
    }
}

class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    //覆寫toString()
    public String toString() {
        //大量拼接字串-> StringBuffer/StringBuilder
        return "姓名:"+this.name+"  年齡:"+this.age;
    }
}

2.物件比較——equals( )

String類的equals( )方法就是覆寫的Object類中的equals( )方法。

  • 要比較一個類中兩個物件的屬性,覆寫equals( )
  1. 先判斷obj是否是該類的例項(是->2)
  2. 再判斷是否是與自己比較(是->3)
  3. 向下轉型,取得屬性並比較

equals()覆寫

程式碼示例:

public class ObjectTest2 {
    public static void main(String[] args) {
        Person per1=new Person("李四",20);
        Person per2=new Person("李四",20);
        System.out.println(per1.equals(per2));  //true
        System.out.println(per1.equals(new ObjectTest2())); //false
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    //如果不覆寫equals則原equals(Object obj) 返回(this == obj)
    //相當於per1==per2
    public boolean equals(Object obj) {
        if(obj==null){
            return false;
        }
        //obj是自己(地址)
        if(obj==this){
            return true;
        }

        //判斷obj是否是Person的例項
        if (!(obj instanceof Person)) {
            return false;
        }
       
        //同一個類的不同物件(內容)
        //因為Object類沒有name、age屬性
        //向下轉型,取得Person類的name、age的屬性
        Person per = (Person) obj;
        //分別比較name,age
        return per.name.equals(this.name)&&(per.age==this.age);
    }
}

3.接收引用資料型別

Object類可以接收Java所有資料型別的物件,包括:類、陣列、介面。

  • 類和介面等級相同,兩者之間不可繼承/實現,但是Java中的強制要求Object可以接收介面。
  • 包裝型別—引用資料型別

程式碼示例:

public class ObjectTest3 {
    public static void main(String[] args) {
        //Object接收陣列物件
        Object obj = new int[]{1,3,5,7,9};
        //向下轉型,需強轉
        int[] data = (int[]) obj;  
        System.out.println(data[0]);  //1

        //Object接收介面物件
        IMessage msg = new MessageImpl();
        Object obj1 = msg;
        ((IMessage) obj1).test();  //bonjour!
        System.out.println(obj1);  //預設呼叫to.String()  //[email protected]
    }
}

interface IMessage{
    void test();
}

class MessageImpl implements IMessage{
    @Override
    public void test() {
        System.out.println("bonjour!");
    }
}