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
方法在非空物件引用上實現相等關係:
-
自反性:對於任何非空引用值
x
,x.equals(x)
都應返回true
。 -
對稱性:對於任何非空引用值
x
和y
,當且僅當y.equals(x)
返回true
時,x.equals(y)
才應返回true
。 -
傳遞性:對於任何非空引用值
x
、y
和z
,如果x.equals(y)
返回true
,並且y.equals(z)
返回true
,那麼x.equals(z)
應返回true
。 -
一致性:對於任何非空引用值
x
和y
,多次呼叫 x.equals(y) 始終返回true
或始終返回false
,前提是物件上equals
比較中所用的資訊沒有被修改。 - 對於任何非空引用值
x
,x.equals(null)
都應返回false
。
Object
類的 equals 方法實現物件上差別可能性最大的相等關係;即,對於任何非空引用值 x
和 y
,當且僅當 x
和 y
引用同一個物件時,此方法才返回 true
(x == 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();
}
}