class Insect {
private int size;
private String color;
public Insect(int size, String color) {
this.size = size;
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void move() {
System.out.println("Move");
}
public void attack() {
move(); //假設昆蟲在攻擊前必須要先移動一次
System.out.println("Attack");
}
}
/////子類
class Bee extends Insect {
public Bee(int size, String color) {
super(size, color);
}
public void move() {
System.out.println("Fly");
}
public void attack() {
move();
super.attack();//調用了父類的attack,但是調用了子類的move()
}
}
public class InheritanceVSComposition {
public static void main(String[] args) {
Insect i = new Bee(1, "red");
i.attack();
}
}
輸出結果為:
Fly
Fly
Attack
第47行,super.attack();為什麼是調用了子類的move()而不是父類的?能解釋下原理嗎?
子類覆寫父類的方法,因為調用是從子類發出的,因此在父類中還是調用的子類的move方法;
再說this問題,this也是一個對象,但是不要將this理解成Inspect對象,this還是指的是調用者Bee的對象,你可以在調用this.move()方法前,打印一下,比如
System.out.print(this);