看下面的例子,觉得应该输出什么?
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
扫描二维码关注公众号,回复:
832099 查看本文章
所以,调用的是B中的set方法!
可是,为什么会这样了?
是不是可以这样理解,把B() 中的super()调用看成是"this.super()(实际上子类是不能访问父类的构造方法的,除了使用super)"
super()和它里面的set()都是同一个级别的,也就是都是通过同一个this访问的
这就好比调用B自己类中实现了的set() , 然后set()中又有一个新的方法 get() , 这个get()不就等同于super()中的set()吗?