1, 以下代码执行的结果显示是多少( )?
public class Demo {
class Super{ int flag=1;
Super(){
test();
}
void test(){
System.out.println("Super.test() flag="+flag);
}
} class Sub extends Super{
Sub(int i){
flag=i;
System.out.println("Sub.Sub()flag="+flag);
} void test(){
System.out.println("Sub.test()flag="+flag);
}
} public static void main(String[] args) {
new Demo().new Sub(5);
}
}
//Sub.test()flag=1
//Sub.Sub()flag=5
在继承中代码的执行顺序为:
1.父类静态对象,父类静态代码块
2.子类静态对象,子类静态代码块
3.父类非静态对象,父类非静态代码块
4.父类构造函数
5.子类非静态对象,子类非静态代码块
6.子类构造函数
1.首先调用父类构造方法,即super(){父类先初始化了 int flag = 1,然后执行父类的构造函数Super()}
2.调用test()方法。
3.由于在子类sub()中重写了test()方法,所以调用子类test()
4.输出Sub.test() flag=1
5.调用sub的有参构造方法
6.输出Sub.Sub() flag=5
重点在于要时刻记得子类重写父类方法,调用时会调用子类重写之后的方法
当然,这一切的前提都是 实例化子类对象
2,下面代码的输出是什么? // null
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();
}
}
new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。
创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null 。
调用构造函数才会完成初始化。
题目:https://www.nowcoder.com/questionTerminal/c2bfb1512dfa4a7eab773a5871a52402