Java基础-子父类构造函数、静态变量(代码块)、普通变量的调用顺序
2015-04-19 10:21
357 查看
子父类构造函数、静态变量(代码块)、普通变量的调用顺序
创建子类的时候,先检查父类是否有静态的属性,如果有,则先调用静态属性的语句,然后检查子类是否也有静态类型属性,有,则调用子类的静态类型,然后在调用父类普通变量,构造函数,然后才是子类的普通属性,构造函数。
顺序是:
父类静态
子类静态
父类属性
父类构造函数
子类属性
子类构造函数
注意:如果父类是个抽象类,而这时候父类构造函数调用到子类里的函数,而且需要引用子类的某个属性,这时候这个属性输出多少呢?答案从上面的构造顺序知道,因为父类构造函数运行的时候子类的属性还没有被初始化(准确说应该是没有被用户初始化,但是编译器已经初始化为0)
所以,输出的结果是0。
因此,编写构造器时有一条有益的规则:
“用尽可能简单的方法使对象进入正常状态;如果
可以的话,
避免调用其他方法” 在构造器内唯一能够安全调用的那些方法是基类中的 final方法(也适用于 private 方法,它们自动属于 final 方法)。这些方法不能被重载,因此也就不会出现上述令人惊讶的问题。
单步跟踪一下代码可验证结果:
创建子类的时候,先检查父类是否有静态的属性,如果有,则先调用静态属性的语句,然后检查子类是否也有静态类型属性,有,则调用子类的静态类型,然后在调用父类普通变量,构造函数,然后才是子类的普通属性,构造函数。
顺序是:
父类静态
子类静态
父类属性
父类构造函数
子类属性
子类构造函数
注意:如果父类是个抽象类,而这时候父类构造函数调用到子类里的函数,而且需要引用子类的某个属性,这时候这个属性输出多少呢?答案从上面的构造顺序知道,因为父类构造函数运行的时候子类的属性还没有被初始化(准确说应该是没有被用户初始化,但是编译器已经初始化为0)
所以,输出的结果是0。
因此,编写构造器时有一条有益的规则:
“用尽可能简单的方法使对象进入正常状态;如果
可以的话,
避免调用其他方法” 在构造器内唯一能够安全调用的那些方法是基类中的 final方法(也适用于 private 方法,它们自动属于 final 方法)。这些方法不能被重载,因此也就不会出现上述令人惊讶的问题。
单步跟踪一下代码可验证结果:
class BB{ static int m = 4; private int st = 3; BB(){ System.out.println("father constractor"); } } public class staticTest extends BB{ static int a = 4; private int sy = 3; staticTest(){ System.out.println("son constractor"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // BB b = new BB(); staticTest bb = new staticTest(); System.out.println("static test"); } }
相关文章推荐
- java 继承类 变量、静态变量、构造函数执行顺序
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的研究
- java 继承类 变量、静态变量、构造函数执行顺序
- java 继承类 变量、静态变量、构造函数执行顺序
- 黑马程序员_Java基础_面向对象(继承、子父类变量和函数以及构造函数特点、final关键字、抽象类、模版方法模式、接口)
- 关于JAVA继承类的静态变量、成员变量、父子类构造方法调用顺序的探讨 .
- java中普通变量、静态变量、静态代码块初始化的顺序辨析
- java中普通变量、静态变量、静态代码块初始化的顺序辨析
- Java类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法
- java中普通变量、静态变量、静态代码块初始化的顺序辨析
- Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- java基础---静态变量,成员变量,局部变量及类的初始化顺序
- [转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- java基础-显示代码,构造代码块 , 构造函数的初始化顺序
- java中普通变量、静态变量、静态代码块初始化的顺序辨析
- java 成员变量 静态变量代码块 静态代码快加载顺序
- Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序