1. 程式人生 > 其它 >Java之面向物件例子(三) 多型,重寫,過載,equals()方法和toString()方法的重寫

Java之面向物件例子(三) 多型,重寫,過載,equals()方法和toString()方法的重寫

重寫(繼承關係)

子類得成員方法和父類的成員方法,方法名,引數型別,引數個數完全相同,這就是子類的方法重寫了父類的方法。

過載

在一個類裡有兩個方法,方法名是完全一樣的,引數型別或引數個數不同。

例子:

//父類
public class Pet {
    public void eat(){
        System.out.println("pet eat");
    }
    public void eat(String a){    //過載,同一個類,方法名相同,引數型別或個數不同
        System.out.println("pet String eat");
    }
}
//子類
public class Cat extends Pet{
    public void eat(){    //重寫
        System.out.println("cat eat");
    }
    public void eat(int a){
        System.out.println("cat int eat");
    }
}

toString() 方法重寫

返回該物件的字串表示。通常, toString 方法會返回一個“以文字方式表示”此物件的字串。結果應是一個簡明但易於讀懂的資訊表示式。建議所有子類都重寫此方法。 Object 類的 toString

 方法返回一個字串,該字串由類名(物件是該類的一個例項)、at 標記符“@”和此物件雜湊碼的無符號十六進位制表示組成。換句話說,該方法返回一個字串,它的值等於: getClass().getName() + '@' + Integer.toHexString(hashCode()) 返回:該物件的字串表示形式。

直接呼叫 toString() 方法

還可以點選 Source 中的Genenrate toString() 方法來選擇要使用該方法的引數 和方法 來生成官方的 toString() 方法

public class Pet {
    public void eat(){
        System.out.println("pet eat");
    }
    public void eat(String a){    //過載,同一個類,方法名相同,引數型別或個數不同
        System.out.println("pet String eat");
    }
    @Override
    //官方提供的重寫toString() 方法
    public String toString() {
        return "Pet [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
                + "]";
    }
}

equals方法重寫

equals比較兩個new例項化的物件返回結果一定為false,重寫讓他比較物件的屬性

public boolean equals(Object obj) 指示其他某個物件是否與此物件“相等”。 equals 方法在非空物件引用上實現相等關係:

  • 自反性:對於任何非空引用值 xx.equals(x) 都應返回 true
  • 對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true
  • 傳遞性:對於任何非空引用值 xy 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true
  • 一致性:對於任何非空引用值 x 和 y,多次呼叫 x.equals(y) 始終返回 true 或始終返回 false,前提是物件上 equals 比較中所用的資訊沒有被修改。
  • 對於任何非空引用值 xx.equals(null) 都應返回 false

Object 類的 equals 方法實現物件上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個物件時,此方法才返回 truex == y 具有值 true)。 注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。 引數:obj - 要與之比較的引用物件。返回:如果此物件與 obj 引數相同,則返回 true;否則返回 false

instanceof

java中的instanceof運算子是用來在執行時指出物件是否是特定類的一個例項。instanceof通過返回一個布林值來指出,這個物件是否是這個特定類或者是它的子類的一個例項。

public class Pet {
    private String name;
    private String sex;
    public void eat(){
        System.out.println("pet eat");
    }
    public void eat(String a){    //過載,同一個類,方法名相同,引數型別或個數不同
        System.out.println("pet String eat");
    }
    @Override
    //官方提供的重寫toString() 方法
    public String toString() {
        return "Pet [getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString()
                + "]";
    }
    public boolean equals(Object obj){
        if(obj!=null){
            if(obj instanceof Pet){ //判斷傳入的物件是不是Pet類的
                Pet t1=(Pet)obj;  //將obj強制轉換成Pet
                return this.equals(t1.name)&&this.equals(t1.sex);    //判斷當前物件的屬性是否相同
            }
        }
        return false;
    }
}

物件轉型(casting) --父類的引用可以指向其子類的物件 --父類的引用不可以訪問其子類物件新增的成員(包括屬性和方法), 如果硬要訪問-->強轉 --可以使用instanceof關鍵字來判斷一下這個變數是不是這個類或者是這類的子類

父類的引用指向子類的物件:

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Pet c=new Cat();
        c.eat();
    }
}