public class Test extends Base{
public void test(){
System.out.println("test");
}
public static void main(String[] args){
Test test=new Test();
}
}
class Base{
public Base(){
test();
}
public void test(){
System.out.println("base");
}
}
调用的是子类中的test( )方法,输出test,创建子类对象,调用父类构造器时,调用的为什么是子类的test()方法?
因为当前的this对象就是子类的实例,子类的构造函数实际上是两部分代码父类的构造部分,子类的构造部分,子类的非静态代码块,几个方面的代码组成的。
本质上是子类的方法的,以当前this实例的方法就是子类的test()
子类没有调用父类的构造方法,所以自动调用父类无参的构造方法,执行test()方法
Base test = new Test();
Test test = new Test();
两个方法都市调用子类的test()方法,因为子类重写了父类的test()方法
子类没有构造方法,所以使用缺省构造方法,如
public Test (){
super();
}
这样就使用了父类的构造方法,子类中重写了父类的方法,所以输出的都是test
子类中重写了test方法,创建的子类的对象,调用的当然是子类的方法了。
感觉只是子类单纯的重写父类的方法
这是代码执行顺序的问题,首先子类在创建对象的时候发现没有构造去调用父类的构造,调用父类构造的时候发现需要调用test方法,首先会在子类中查找是否有此方法,有调用,没有到父类中查找然后调用!
你这创建的是子类对象,默认调用自己的构造方法,可以用super.调父类的
子类的引用指向子类的实例,子类被实例化之前会先实例化父类,(父亲先出来才有儿子),子类重写了父类的方法,所以打印的是子类。