话不多说,先贴代码
package com.chenxin;
public class TestForPolymorphism {
public static void main(String[] args) {
Cat catee = new Cat(10);
catee.makeVoice();
}
static abstract class Animal {
private int age = 100;
public Animal(int age) {
this.age = age;
}
public abstract void makeVoice();
}
static class Cat extends Animal {
private int age = 20;
public Cat(int age) { //当父类定义了有参构造方法,而没有重写无参构造方法时,必须继承父类有参构造方法
super(age); //而且,该构造方法中必须调用父类构造方法
}
@Override
public void makeVoice() {
System.err.println("miao, my age is: " + age);
}
}
}
输出为:miao, my age is: 20。也就是Cat预定义的变量值。
如果改为如下:
package com.chenxin;
public class TestForPolymorphism {
public static void main(String[] args) {
Cat catee = new Cat(10);
catee.makeVoice();
}
static abstract class Animal {
protected int age = 100;
public Animal(int age) {
this.age = age;
}
public abstract void makeVoice();
}
static class Cat extends Animal {
public Cat(int age) { //当父类定义了有参构造方法,而没有重写无参构造方法时,必须继承父类有参构造方法
super(age); //而且,该构造方法中必须调用父类构造方法
}
@Override
public void makeVoice() {
System.err.println("miao, my age is: " + age);
}
}
}
即可得到预期输出:miao, my age is: 10
首先,父类中写了一个有参构造方法,那么默认的无参构造方法就没有了。子类继承父类时,必须重写此构造方法,而且必须在第一行调用super(age)父类构造方法。因为在生成自身实例时,会先调用父类构造方法。
debug得知,在第一个例子中,我们传入参数10。执行顺序可以参照http://blog.csdn.net/xiangaichou/article/details/19993551:
围绕age变量进行阐述,在父类中,首先初始化方法块的age=100,然后执行构造方法,age=10;然后是子类,注意这里,在方法块时就将age改为了自己的20,之后没有其他针对age的操作了。
所以这个“多态”问题,主要还是考察新建实例时的执行机制。
第二个例子就简单了。。。因为子类没有再重新更改age,所以还是原来的值。