问题描述
- 关于java中的super()用法
-
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);
解决方案二:
调用了父类的attack函数,attack函数里面的move函数被子类重写了,所以输出还是fly,你把父类attack的move函数改成this.move试试看(我也刚学Java,只是交流意见)。
解决方案三:
super的用法 构造器和方法,都用关键字super指向超类,但是用的方法不一样。方法用这个关键字去执行被重载的超类中的方法。看下面的例子: class Mammal { void getBirthInfo() { System.out.println("born alive."); } } class Platypus extends Mammal { void getBirthInfo()......
答案就在这里:java中super的用法
----------------------
解决方案四:
super代表父类啊!所以是调用父类的啊!this代表本类
解决方案五:
i是子类Bee的实例,子类Bee重写了move()方法。
解决方案六:
super 和this 一样,区别在于super代表父类 ,this代表当前类,
解决方案七:
super 和this 一样,区别在于super代表父类 ,this代表当前类,
解决方案八:
public void attack() {
move(); //就是this.move();
System.out.println("Attack");
}
调用super.attack(); 时,
attack方法中的this是指向子类(因为是子类调用的),而不是父类.
解决方案九:
attack方法中的this是指向引用对象,即现在是什么类型,就访问哪种类型