記錄一下看過的東西:
1.instanceof
public class Foot {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Apple extends Foot {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
Foot foot=new Apple();
Foot foot1=new Foot();
Apple apple=new Apple();
((Apple) foot).setColor("green");
if (foot instanceof Apple){
System.out.println("33333");
System.out.println(((Apple) foot).getColor());
}
if (foot1 instanceof Apple){
System.out.println("444444");
}
if (apple instanceof Foot){
System.out.println("55555");
}
輸出結果:
類及其子類都是其實例,能通過instanceof的校驗。
2.抽象類
public abstract class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void getDescroption();
}
public class Dog extends Animal {
@Override
public void getDescroption() {
System.out.println("this is a dog");
}
}
Animal animal=new Dog();
animal.getDescroption();
輸出結果:
定義抽象類的實例實際上是抽象類實現類的實例,在調用抽象方法時,實際上是調用的子類對象中的方法。
可以看出抽象方法一個很重要的角色就是佔位,一是保證了實現類一定實現具體方法,二是使用變量animal調用子類對象中的方法實現,編譯只允許調用在類中聲明的方法。
如果省略了抽象方法的定義,實際上變成了只存在從屬關係的父子類。
3.equals方法
在Object中,這個方法將判斷兩個對象是否具有相同的引用。(參考前面的值傳遞,對象參數傳遞的是地址的拷貝)
Object是所有類的超類,如果想比較自己創建的類,如姓名,年齡等數據一致,就認爲是同一Cat,此時就需要重寫equals方法。
public class Cat {
private int age;
private String name;
private boolean tag;
@Override
public boolean equals(Object o) {
//實參o傳遞的是地址值的副本
//檢測this和o是否引用同一個對象
if (this == o) return true;
//檢測o是否爲null,或者this和o是否屬於同一個類
if (o == null || getClass() != o.getClass()) return false;
//將o轉換爲Cat類型
Cat cat = (Cat) o;
//判斷實例域數據是否匹配
return age == cat.age &&
tag == cat.tag &&
Objects.equals(name, cat.name);
}
}
如果Cat的所有子類不變,可以用 ! (o instanceof Cat) 代替getClass != o.getClass(),數據一致的情況下所有的子類也可以通過equals判斷。這是特殊情況,建議不要使用——違反equals的對稱性。