繼承和多型
阿新 • • 發佈:2021-01-12
封裝回顧
概念:屬性私有化(private),提供公共(public)setter&getter方法訪問私有屬性。
目的:提高資料的安全性。(額外進行控制)
抽象
前提:具有相同屬性和方法。
場景:物件 -> 類 、類 -> 父類
繼承
父類:類抽象的到父類,必須滿足is-a關係。
圖片描述
都是類(class),父類更抽象、子類更具體。
繼承:將相同的屬性和方法抽象到父類中,子類繼承(extends)父類,子類就可以繼承父類中public+protected型別的的屬性和方法。
繼承優點:提高維護性和擴充套件性。
子類會預設呼叫父類無引數的構造方法。
重寫:父子類中,方法名、引數、返回值都相同。許可權不能縮小。
多型
eg:
public class Dog extends Pet{
public Dog(String kind){
super(kind);//呼叫父類構造方法
}
@Override
public String bark(){
return getName() + "在叫:汪汪";
}
public void loolDoor(){
System.out.println(getName() + "在看門");
}
}
public class Cat extends Pet{ public Cat(String kind){ super(kind); } @Override public String bark(){ return super.bark() + "喵喵"; } public void catchMouse(){ System.out.println(getName() + "在捉老鼠"); } }
public class Pet { //屬性 private String name; private int age; private String sex; private String kind; //初始化塊 { this.name = "未知"; } //構造方法(方法過載) public Pet(String kind) { this.kind = kind; } //成員方法 public void eat(String food){ System.out.println(name + "在吃" + food); } public void sleep(){ System.out.println(name + "在睡覺"); } public String bark(){ return name + "在叫:"; } //getter&setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if(age >= 20 || age < 0){ System.out.println("資料錯誤!"); }else{ this.age = age; } } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getKind() { return kind; } }
public class Master {
public static void main(String[] args) {
Dog pet1 = new Dog("金毛");
pet1.setName("旺財");
pet1.eat("骨頭");
((Dog)pet1).loolDoor();
System.out.println(pet1.bark());
Cat pet2 = new Cat("波斯");
pet2.setName("咪咪");
pet2.eat("魚");
((Cat)pet2).catchMouse();
System.out.println(pet2.bark());
}
}