看下面的例子,觉得应该输出什么?
public class A {
public A() {
//先把下面这句去掉
//System.out.println(this.getClass());
set();
}
void set() {
System.out.println("A");
}
static class B extends A {
B() {
set();
}
void set() {
get();
System.out.println("B");
}
void get(){
}
}
public static void main(String[] args) {
B b = new B();
}
}
当时,看到这个题目,犯了两个错误:
1. 不知道new B() 的时候,如果没有指定父类的构造方法,就会默认的调用A(), 也就是super();
new B的时候,必须B这个类加载到内存,可是B是继承自A的,也可以理解为依赖
所以,当然首先得把A加载到内存!
2. 知道会默认的调用父类的构造方法后,不确定调用的到底是哪个set()方法!
其实 ,上面代码打印的应该是两个B,不会调用A中的set
通过在A中的构造方法打印在调用set方法的对象时,注意不是A , 而是A$B
所以,调用的是B中的set方法!
可是,为什么会这样了?
是不是可以这样理解,把B() 中的super()调用看成是"this.super()(实际上子类是不能访问父类的构造方法的,除了使用super)"
super()和它里面的set()都是同一个级别的,也就是都是通过同一个this访问的
这就好比调用B自己类中实现了的set() , 然后set()中又有一个新的方法 get() , 这个get()不就等同于super()中的set()吗?