解题思路:Java初始化的执行顺序,可以通过Debug来验证这一过程。
父类–静态变量、静态方法块
子类–静态变量、静态方法块
父类–普通变量、普通方法块
父类–构造器
子类–普通变量、普通方法块
子类–构造器
这种题型一般会和多态一起考:即 父引用=子对象
编译看左边,运行看右边
- 编译时候,看左边的引用有没有该方法,没有就不可以使用
- 运行时候,看右边的对象的方法,使用它的方法。
注意:在父类的构造方法、方法块里 执行的普通方法是也是遵守这多态的原则。
1.下面代码的输出是什么?
public class Base
{
private String baseName = "base";
public Base()
{
callName();
}
public void callName()
{
System. out. println(baseName);
}
static class Sub extends Base
{
private String baseName = "sub";
public void callName()
{
System. out. println (baseName) ;
}
}
public static void main(String[] args)
{
Base b = new Sub();
}
}
按照解题思路本题的执行顺序:
- 父类的普通变量baseName
- 父类的构造方法Base(),此方法调用的callName方法。
- callName方法考的是多态知识,如果子类没有重写该方法,则调用父类自己的,如果子类重写了,即调用子类的方法()
- 调用子类的callName(),执行输出语句,输出变量baseName ,
- baseName 变量也考查了多态,这里子类重写了baseName 属性,那应该调用子类重写的属性。但是此时子类普通属性还没有初始化,需要等父类的构造器执行结束后才能执行
- 输出null
- 如果把子类的baseName 删除,这里开始就要涉及到访问权限的问题了。父类的属性是私有的,在子类调用会报错。