`
guomingzhang2008
  • 浏览: 157459 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java类执行顺序

    博客分类:
  • Java
阅读更多
1、调用顺序:
JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码-->;初始化子类的静态代码-->;
(创建实例时,如果不创建实例,则后面的不执行)初始化父类的非静态代码-->;初始化父类构造函数-->;初始化子类非静态代码-->;初始化子类构造函数
2 、类只有在使用New调用创建的时候才会被JAVA类装载器装入
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继承的子类的初始化块执行,最后是子类的构造方法
5、类消除时候,首先消除子类部分,再消除父类部分
1.  父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2.  子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3.  父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4.  父类构造方法
5.  子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6.  子类构造方法

注意:
只有当通过new对象实例或静态变量被访问时,静态变量才被初始化;
如:Person类,有静态变量a和b,通过Person.a的方式,变量a被初始化,但是变量b没有被出示化。

代码如下:

/**
 * 父类
 *
 * @author 张国明 [url=mailto:guomingzhang2008@163.com]guomingzhang2008@163.com[/url]
 * @version 2012-07-27 下午1:15
 */
public abstract class Father {
    private static final String NAME = "父类";
    // 静态成员变量和静态初始化块级别相同 所以按照在代码中的顺序依次执行
    // 1、初始化父 静态成员变量 static int sage
    static int sage = getNumber(50, NAME);
    // 2、初始化父 静态初始化块 static
    static {
        System.out.println("父类 base static block");
    }
    //5、初始化父类的非静态代码:非静态成员变量和非静态初始化块级别相同
    public int age = getNumber(100, NAME);
    //6、初始化块:非静态成员变量和非静态初始化块级别相同
    {
        System.out.println("父类 base nonstatic block");
    }
    //7、初始化父类构造函数
    Father() {
        System.out.println("父类 构造器 base start");
        System.out.println(age);
        draw();// 会调用子类覆盖后的方法
        System.out.println("父类 构造器 base end");
    }
    static int getNumber(int base, String name) {
        System.out.println(name + " base.getNumber int" + base);
        return base;
    }
    private void draw() {
        System.out.println("父类 base.draw");
    }
}

/**
 * 子类
 *
 * @author 张国明 [url=mailto:guomingzhang2008@163.com]guomingzhang2008@163.com[/url]
 * @version 2012-07-27 下午1:16
 */
public class Son extends Father {
    private static final String NAME = " 子类";
    // 静态成员变量和静态初始化块级别相同 所以按照在代码中的顺序依次执行 
    //3、初始化子 静态成员变量 static int sage
    static int sage = getNumber(250, NAME);
    //4、初始化子 静态初始化块 static
    static {
        System.out.println(" 子类 subclass static block");
    }
    //8、初始化子类的非静态代码:非静态成员变量和非静态初始化块级别相同
    public int age = getNumber(1001, NAME);
    //9、初始化子类的非静态代码:非静态成员变量和非静态初始化块级别相同
    private int _radius = getNumber(10, NAME);
    //10、初始化块:非静态成员变量和非静态初始化块级别相同
    {
        System.out.println(" 子类 subclass nonstatic block");
    }
    //11、初始化子类构造函数
    Son(int radius) {
        System.out.println(" 子类 构造器 base start");
        _radius = radius;
        draw();
        System.out.println(age);
        System.out.println(" 子类 initializeOrder initialized");
        System.out.println(" 子类 构造器 base end");
    }
    private void draw() {
        System.out.println(" 子类 initializeOrder.draw " + _radius);
    }
    /**
     * @param args args
     */
    public static void main(String[] args) {
        new Son(1000);
    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics