本人java初学者,最近学习到异常处理,在试着自己写一个异常处理时遇到了一个问题。
我想通过无参构造方法直接把 message传给父类的含参构造方法。
这个会报错,我搜了一下这个问题,大概是由于message这个实例变量是在构造方法执行后才会初始化,而子类构造方法执行前必需先执行父类的构造方法,这样无法将message传入父类构造方法就会出现错误。如果将message变量改成static类型的就没错了。
这个原因我基本能理解 但对下面这种情况我又有点困惑
这其实是很常用的一种方法 通过子类含参构造方法将参数传给父类含参构造方法,但按前面的理解不应该是调用子类构造方法前必需先调用父类的构造方法吗?这时message是怎么传给父类的呢?
其实就是类的加载初始化的问题。
简单来说就是在你的父类初始化的时候,你的message还没有初始化。
加载顺序如下:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
子类main方法
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
详细的话可以参考这篇文章:类的初始化顺序
希望对你有帮助!