Java类执行顺序

例子一 其它类Main方法 调用 子类构造方法

public class Sequence1MainTest {
    /**
     * -------类 声明-------
     * -------构造器-------
     * 父类 静态代码块
     * 子类 静态代码块
     * 父类 普通代码块
     * 父类 构造器
     * 子类 普通代码块
     * 子类 构造器
     * -------构造器2-------
     * 父类 普通代码块
     * 父类 构造器
     * 子类 普通代码块
     * 子类 构造器
     * -------私有方法-------
     * 子类 普通方法
     */
    public static void main(String[] args) {
        System.out.println("-------类 声明-------");
        Sequence1ChildTest test;
        System.out.println("-------构造器-------");
        test = new Sequence1ChildTest();
        System.out.println("-------构造器2-------");
        test = new Sequence1ChildTest();
        System.out.println("-------私有方法-------");
        test.method();
    }
}
class Sequence1ChildTest extends Sequence1ParentTest {
    { System.out.println("子类 普通代码块"); }
    static { System.out.println("子类 静态代码块"); }
    public Sequence1ChildTest() { System.out.println("子类 构造器"); }
    public void method() { System.out.println("子类 普通方法"); }
    public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence1ParentTest {
    { System.out.println("父类 普通代码块"); }
    static { System.out.println("父类 静态代码块"); }
    public Sequence1ParentTest() { System.out.println("父类 构造器"); }
    public void method() { System.out.println("父类 普通方法"); }
    public static void staticMethod() { System.out.println("父类 静态方法"); }
}

例子二 子类Main方法 调用 子类构造方法

public class Sequence2ChildTest extends Sequence2ParentTest {
    /**
     * 父类 静态代码块
     * 子类 静态代码块
     * -------类 声明-------
     * -------构造器-------
     * 父类 普通代码块
     * 父类 构造器
     * 子类 普通代码块
     * 子类 构造器
     * -------构造器2-------
     * 父类 普通代码块
     * 父类 构造器
     * 子类 普通代码块
     * 子类 构造器
     * -------私有方法-------
     * 子类 普通方法
     */
    public static void main(String[] args) {
        System.out.println("-------类 声明-------");
        Sequence2ParentTest test;
        System.out.println("-------构造器-------");
        test = new Sequence2ChildTest();
        System.out.println("-------构造器2-------");
        test = new Sequence2ChildTest();
        System.out.println("-------私有方法-------");
        test.method();
    }
    { System.out.println("子类 普通代码块"); }
    static { System.out.println("子类 静态代码块"); }
    public Sequence2ChildTest() { System.out.println("子类 构造器"); }
    public void method() { System.out.println("子类 普通方法"); }
    public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence2ParentTest {
    { System.out.println("父类 普通代码块"); }
    static { System.out.println("父类 静态代码块"); }
    public Sequence2ParentTest() { System.out.println("父类 构造器"); }
    public void method() { System.out.println("父类 普通方法"); }
    public static void staticMethod() { System.out.println("父类 静态方法"); }
}

例子三 其它类Main方法 调用 子类静态方法

public class Sequence3MainTest {
    /**
     * -------类 声明-------
     * -------静态方法-------
     * 父类 静态代码块
     * 子类 静态代码块
     * 子类 静态方法
     * -------静态方法2-------
     * 子类 静态方法
     */
    public static void main(String[] args) {
        System.out.println("-------类 声明-------");
        Sequence3ChildTest test;
        System.out.println("-------静态方法-------");
        Sequence3ChildTest.staticMethod();
        System.out.println("-------静态方法2-------");
        Sequence3ChildTest.staticMethod();
    }
}
class Sequence3ChildTest extends Sequence3ParentTest {
    { System.out.println("子类 普通代码块"); }
    static { System.out.println("子类 静态代码块"); }
    public Sequence3ChildTest() { System.out.println("子类 构造器"); }
    public void method() { System.out.println("子类 普通方法"); }
    public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence3ParentTest {
    { System.out.println("父类 普通代码块"); }
    static { System.out.println("父类 静态代码块"); }
    public Sequence3ParentTest() { System.out.println("父类 构造器"); }
    public void method() { System.out.println("父类 普通方法"); }
    public static void staticMethod() { System.out.println("父类 静态方法"); }
}

例子四 子类Main方法 调用 子类 静态方法

public class Sequence4ChildTest extends Sequence4ParentTest {
    /**
     * 父类 静态代码块
     * 子类 静态代码块
     * -------类 声明-------
     * -------静态方法-------
     * 子类 静态方法
     * -------静态方法2-------
     * 子类 静态方法
     */
    public static void main(String[] args) {
        System.out.println("-------类 声明-------");
        Sequence4ChildTest test;
        System.out.println("-------静态方法-------");
        Sequence4ChildTest.staticMethod();
        System.out.println("-------静态方法2-------");
        Sequence4ChildTest.staticMethod();
    }
    { System.out.println("子类 普通代码块"); }
    static { System.out.println("子类 静态代码块"); }
    public Sequence4ChildTest() { System.out.println("子类 构造器"); }
    public void method() { System.out.println("子类 普通方法"); }
    public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence4ParentTest {
    { System.out.println("父类 普通代码块"); }
    static { System.out.println("父类 静态代码块"); }
    public Sequence4ParentTest() { System.out.println("父类 构造器"); }
    public void method() { System.out.println("父类 普通方法"); }
    public static void staticMethod() { System.out.println("父类 静态方法"); }
}

例子五 其它类Main方法 调用 子类反射实例对象

public class Sequence5MainTest {
    /**
     * -------类 声明-------
     * -------构造器-------
     * 父类 静态代码块
     * 子类 静态代码块
     * 父类 普通代码块
     * 父类 构造器
     * 子类 普通代码块
     * 子类 构造器
     * -------构造器2-------
     * 父类 普通代码块
     * 父类 构造器
     * 子类 普通代码块
     * 子类 构造器
     * -------私有方法-------
     * 子类 普通方法
     */
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        System.out.println("-------类 声明-------");
        Sequence5ChildTest test;
        System.out.println("-------构造器-------");
        test = Sequence5ChildTest.class.newInstance();
        System.out.println("-------构造器2-------");
        test = Sequence5ChildTest.class.newInstance();
        System.out.println("-------私有方法-------");
        test.method();
    }
}
class Sequence5ChildTest extends Sequence5ParentTest {
    { System.out.println("子类 普通代码块"); }
    static { System.out.println("子类 静态代码块"); }
    public Sequence5ChildTest() { System.out.println("子类 构造器"); }
    public void method() { System.out.println("子类 普通方法"); }
    public static void staticMethod() { System.out.println("子类 静态方法"); }
}
class Sequence5ParentTest {
    { System.out.println("父类 普通代码块"); }
    static { System.out.println("父类 静态代码块"); }
    public Sequence5ParentTest() { System.out.println("父类 构造器"); }
    public void method() { System.out.println("父类 普通方法"); }
    public static void staticMethod() { System.out.println("父类 静态方法"); }
}

例子六 其它类Main方法 调用 两个子类构造方法

public class Sequence6MainTest {
    /**
     * -------类 声明-------
     * -------子类1 构造器-------
     * 父类 静态代码块
     * 子类1 静态代码块
     * 父类 普通代码块
     * 父类 构造器
     * 子类1 普通代码块
     * 子类1 构造器
     * -------子类2 构造器-------
     * 子类2 静态代码块
     * 父类 普通代码块
     * 父类 构造器
     * 子类2 普通代码块
     * 子类2 构造器
     * -------私有方法-------
     * 子类2 普通方法
     */
    public static void main(String[] args) {
        System.out.println("-------类 声明-------");
        Sequence6ParentTest test;
        System.out.println("-------子类1 构造器-------");
        test = new Sequence6Child1Test();
        System.out.println("-------子类2 构造器-------");
        test = new Sequence6Child2Test();
        System.out.println("-------私有方法-------");
        test.method();
    }
}
class Sequence6Child1Test extends Sequence6ParentTest {
    { System.out.println("子类1 普通代码块"); }
    static { System.out.println("子类1 静态代码块"); }
    public Sequence6Child1Test() { System.out.println("子类1 构造器"); }
    public void method() { System.out.println("子类1 普通方法"); }
    public static void staticMethod() { System.out.println("子类1 静态方法"); }
}
class Sequence6Child2Test extends Sequence6ParentTest {
    { System.out.println("子类2 普通代码块"); }
    static { System.out.println("子类2 静态代码块"); }
    public Sequence6Child2Test() { System.out.println("子类2 构造器"); }
    public void method() { System.out.println("子类2 普通方法"); }
    public static void staticMethod() { System.out.println("子类2 静态方法"); }
}
class Sequence6ParentTest {
    { System.out.println("父类 普通代码块"); }
    static { System.out.println("父类 静态代码块"); }
    public Sequence6ParentTest() { System.out.println("父类 构造器"); }
    public void method() { System.out.println("父类 普通方法"); }
    public static void staticMethod() { System.out.println("父类 静态方法"); }
}

结果

1、静态代码块是类对象初始化方法,类被加载时最先执行且只执行一次;

执行顺序是先父类,再子类,只执行一次;

2、普通代码块是实例对象初始化方法,每次new或反射newInstance生成实例对象时都会执行一次,可以执行多次;

执行顺序是先父类普通代码块,再父类构造方法,然后子类普通代码块,最后子类构造方法,多次实例化,多次执行;

3、调用静态方法不会执行非静态方法快。静态方法不能重写,不会涉及父类静态方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我以前不抽烟的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值