1. 程式人生 > >Object類(覆寫toString/equals/接收引用資料型別)

Object類(覆寫toString/equals/接收引用資料型別)

什麼是Objetc類?
Object是JAVA預設提供的類。
在Java中除了Object類,所有的類都有繼承關係,預設會繼承Object父類,所有類物件都可以通過Object類進行接收,即向上轉型。

////Object可以接收任何類
class A{}
class B{}
public class Ob
{
    public static void main(String[] args)
    {
        fun(new A()); //[email protected]
        fun(new B()); //[email protected]
    }
    public static void fun(Object obj)
    {
        System.out.println(obj);  //可以接收任何型別物件
    }
}

取得物件資訊
在使用物件直接輸出的時候,預設輸出的是一個地址編碼。如果現在使用的是String類,該類物件直接輸出的是內
容,主要原因就是toString()方法的問題。

class Person
{
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
}
public class Ob
{
    public static void main(String[] args)
    {
        //使用物件輸出時,預設是地址編碼,如果是String,向上轉型後,呼叫String的toString(),輸出的是物件內容
        fun(new Person("pick",18)); //
[email protected]
fun(new String("hello")); //hello System.out.println(new Person("pick",10));//[email protected] } public static void fun(Object obj) { System.out.println(obj); //預設輸出物件呼叫obj.toString(); //等同於 System.out.println(obj.toString()); } }

預設Object類提供的toString()方法只能夠得到一個物件的地址(而這是所有物件都共同具備的特徵)。如果預設給出的toString()功能不足(不想輸出地址而是輸出本類資訊),需要在子類中覆寫toString()方法。

class Person
{
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public String toString()  //覆寫toString
    {
        return this.name+" "+this.age;
    }
}
public class Ob
{
    public static void main(String[] args)
    {
        //使用物件輸出時,預設是地址編碼,如果是String,向上轉型後,呼叫String的toString(),輸出的是物件內容
        fun(new Person("pick",18)); //pick 18
        fun(new String("hello")); //hello
    }
    public static void fun(Object obj)
    {
        System.out.println(obj); //預設輸出物件呼叫obj.toString();
    }
}

toString()的核心目的在於取得物件資訊。
String作為資訊輸出的重要資料型別,在Java中所有的資料型別只要遇見了String並且執行了"+",那麼都要求將其變為字串後連線,而所有物件要想變為字串就預設使用toString()方法。

物件比較

class Person
{
    private String name;
    private int age;
    public Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public boolean equals(Object ob)
    {
        //判斷obj是否是Person例項,因為Object可以接受所有類的例項
        if(!(ob instanceof Person))  //如果形參是null,涵蓋在這個條件中,即null不是Person類
        {
            return false; //obj不是Person例項,直接返回錯,兩個物件不是一個類就沒必要比較
        }
        if(this==ob) //是同一個物件
            return true;
        Person p=(Person)ob; //需要向下轉型,變回Person類,因為obj裡沒有Person裡的屬性
        return ((this.name==p.name)&&(this.age==p.age));
    }
}
public class Ob
{
    public static void main(String[] args)
    {
       Person p1=new Person("pick",18);
       Person p2=new Person("pick",18); 
       System.out.println(p1.equals(null)); //false
       System.out.println(p1.equals(p2)); //true 
       System.out.println(p1.equals(p2)); //如果沒有在Person中覆寫equals,將輸出false,因為除了equals預設比較的物件地址
    }
}

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

public class Ob
{
    public static void main(String[] args)
    {
        //Object接收陣列型別
        Object ob=new int[]{1,2,3,4,5};  //Object接收引用資料型別
        int[] a=(int[]) ob;
        for(int num : a)
        {
            System.out.print(num+"、"); //1、2、3、4、5、
        }
    }
}

Object接收介面,而Object可以接收介面是Java中的強制要求,因為介面本身不能繼承任何類。

interface IA  //介面
{
    void func();//抽象方法,預設是public 和abstract
}
class AImpl implements IA
{
    public void func()
    {
        System.out.println("hello world");
    }
}
public class Ob
{
    public static void main(String[] args)
    {
        IA ia=new AImpl(); 
        Object ob=ia; //Object可以接收介面
        System.out.println(ob);//[email protected]
        IA a=(IA)ob; //將Object強轉為IA
        a.func();//hello world
    }
}