子类 super()传参的坑

父类

public class BaseServiceImpl<T> {

    public   BaseDaoI baseDaoI;

    public  BaseServiceImpl(BaseDaoI baseDaoI){
        this.baseDaoI =baseDaoI;
    }

子类去继承BaseServiceImpl 需要初始化baseDaoI
子类:

image.png

如图向父类传递baseDaoI对象,但一定需要添加静态修饰。
由于jvm类加载顺序
1)父类的变量,父类的构造函数。
2)子类的变量,子类的构造函数。

所以父类初始化baseDaoI的时候,子类还没有baseDaoI还没初始化,怎么能传递baseDaoI到父类呢。

而添加了static之后 ,子类的<静态>变量是先于父类的变量初始化的。所以传入父类的构造方法则没问题。

去掉static修饰,编译报错。

image.png

最后是加载顺序表

父类静态变量初始化
父类的静态初始化块
子类初始化静态变量
子类的静态初始化块
父类非静态变量初始化
父类的非静态初始化块
父类构造函数 start
父类调用draw方法 null
父类构造函数 end
子类初始化非静态变量
子类初始化私有变量
子类的非静态初始化块
子类构造函数 start
子类调用draw方法子类初始化私有变量
子类构造函数 end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。