Java多态继承的笔试题

Java基础题目

下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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();
}
}

刚开始 我觉得是 sub 但是答案其实是 null

理由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。
创建基类即默认调用Base()方法,在方法中调用callName()方法,
由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法
,此时派生类还未构造,所以变量baseName的值为null

Base b = new Sub(); 而 Sub extends Base ,
所以先寻找Base(父类)的构造方法
public Base() {callName();} ,
而父类和子类都有callName()这个方法,所以这是多态(
1>必须要有继承
2>必须要有重写
3>父类的引用指向子类的对象(实体))
所以 public Base() {callName();} 中的callName()方法指向Sub(子类)的callName()方法;
public void callName() {
System.out.println(baseName);
}
然而baseName这个参数还没有被赋值,所以就输出了null
嗦嘎,就是这样的