本帖最后由 张云飞 于 2013-9-17 16:28 编辑
先看一个代码例子(如果感觉有点乱的话,建议自己边思考边自己写着玩):- class Fruit{
- public static String Fruit_name = "Fruit静态变量";
- public String color = "Fruit非静态变量";
- static{
- System.out.println(Fruit_name); //若将Fruit_name的初始化放在static程序块后边,则编译错误,说明static成员变量及代码块级别相同,只看向后顺序
- //System.out.println(color); //此时color还未初始化
- System.out.println("Fruit的Static程序块");
- }
-
- public Fruit(){
- System.out.println("Fruit()");
- }
-
- { //虽然在构造函数后边,却先执行
- System.out.println("---------------");
- System.out.println(color);
- System.out.println("Fruit非Static程序块");
- }
- }
- public class Apple extends Fruit{
- public static String apple_name = "appale静态变量";
- public String apple_color = "Apple非静态变量";
- static{
- System.out.println(apple_name);
- //System.out.println(apple_color); //此时apple_color还未初始化
- System.out.println("Apple的Static程序块");
- }
- {
- System.out.println("---------------");
- System.out.println(apple_color);
- System.out.println("Apple非Static程序块");
- }
- public Apple(){
- System.out.println("appale()");
- }
- public static void main(String args[]){
- new Apple();
- }
- }
复制代码 初始化次顺序为:
1、父类静态成员变量和静态代码块(看代码中向后顺序执行) --> 子类静态成员变量和静态代码块(看代码中向后顺序执行)
2、父类非静态成员变量和非静态代码块(看代码中向后顺序执行) --> 父类构造方法
3、子类非静态成员变量和非静态代码块(看代码中向后顺序执行) --> 子类构造方法
建议按照自己的思路重新编写一下代码,理解更清楚。
|