刚接触这道题的时候我还在adcd选项中犹豫不决,经过一番查阅资料终于攻克了这道题。
要想成功解决这道题要知道2点
当new Derived()时,会先执行父类的构造方法,然后再去调用子
类中的构造方法;
动态链接: 因为Base是父类,因此Derived对象的引用是可以指向父
类的(向上转型)。当父类定义的方法,在没有被子类重写的情况下,
才可以被父类调用。如果父类定义的方法,被子类重写了,那么父类将会
去被子类中的方法而不是父类。
因为new Derived(),所以将会先去执行父类的构造方法,然后再去
调用子类的构造方法。在执行父类的构造方法时,因为子类重写
addValued(),所以会执行子类中的 value+=20;当再去执行子类的构造方法
结束后,value=40;
总结:
- 使用父类类型的引用指向子类的对象;
- 该引用只能引用父类中定义的方法和变量,如果要调用父类中没有定义的,或者在子类中被重载的方法,需要向上转型(Derived)base;
如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;
源码:
public class Base {
int value=0;
Base(){ System.out.println(value+"父类构造方法1"); addValue(); System.out.println(value+"父类构造方法2"); } void addValue(){ System.out.println(value+"父类的add1"); value+=10; System.out.println(value+"父类的add2"); } int getValue(){ return value; }
}
public class Derived extends Base{
String bt="确定";
String adc;
Derived(){
System.out.println(value+"子类的构造 1");
addValue();
System.out.println(value+"子类的构造 2");
}
void addValue(){
System.out.println(value+"子类的add1");
value+=20;
System.out.println(value+"子类的add2");
}
void addValue(String c){
this.adc=c;
System.out.println("adc:"+adc);
}
}
public class Test {
public static void main(String[] args) {
Base base=new Derived();
System.out.println(base.getValue());
Derived derived=(Derived)base;
derived.addValue("thank");
System.out.println(derived.bt);
}
}
日志:
0父类构造方法1
0子类的add1
20子类的add2
20父类构造方法2
20子类的构造 1
20子类的add1
40子类的add2
40子类的构造 2
40
adc:thank
确定