以下情况下父类可以调到子类的重写方法
package com.skymr.learn;
/**
* 调用子类重写方法
* @author skymr
*
*/
public class SubParentTest2 extends ParentClass2{
private String name;
public SubParentTest2(String name){
this.name = name;
}
public String getDesc(){
return "My Name is "+name;
}
public static void main(String[] args) {
SubParentTest2 st = new SubParentTest2("SubParentTest2");
System.out.println(st);
}
}
class ParentClass2{
private String desc;
public String toString(){
return desc;
}
public String getDesc(){
return "parrent";
}
public ParentClass2(){
this.desc = getDesc();
}
}
输出
My Name is null
分析:
new SubParentTest2()时先运行父类的构造器,父类的desc的结果为子类的getDesc()方法的结果,此时子类的name为null,所以desc值为My Name is null,
子类构造器执行后name才会赋值,而打印st时调用父类的toString()方法,打印的是父类的desc.
当子类重写了父类方法,父类当想调用自己的方法时却调到了子类方法,为了避免出错,应禁止在父类构造器中调用子类重写过的方法
class ParentClass2{
private String desc;
public String toString(){
return getDesc();
}
public String getDesc(){
return "parrent";
}
public ParentClass2(){
}
}
这样就正常了