类中代码执行的顺序

1、先执行静态代码块

点击查看代码
public class ClassTest {

    static{
        System.out.println("静态代码执行了");
    }

    public static void main(String[] args) {
        System.out.println("main方法执行了");
    }
}
![](https://img2024.cnblogs.com/blog/3413037/202405/3413037-20240527163903068-972407021.png)

2、类中定义静态成员变量,会先创建对象

点击查看代码
public class ClassTest {

    static User user=new User();

    static{
        System.out.println("静态代码执行了");
    }

    public static void main(String[] args) {
        System.out.println("main方法执行了");
    }
}

class User{
    public User() {
        System.out.println("user无参构造执行了");
    }
}
![](https://img2024.cnblogs.com/blog/3413037/202405/3413037-20240527164102970-1203553470.png)

3、如果是非静态代码块和非静态成员变量,不执行

点击查看代码
public class ClassTest {

     User user=new User();

    {
        System.out.println("静态代码执行了");
    }

    public static void main(String[] args) {
        System.out.println("main方法执行了");
    }
}

class User{
    public User() {
        System.out.println("user无参构造执行了");
    }
}
![](https://img2024.cnblogs.com/blog/3413037/202405/3413037-20240527164209067-963346583.png)

只有创建了ClassTest对象,非静态代码块和非静态成员变量才会执行,new 了几次对象就会执行多少次,执行的顺序跟代码位置有关

点击查看代码
public class ClassTest {

     User user=new User();

    {
        System.out.println("代码块执行了");
    }

    public static void main(String[] args) {
        System.out.println("main方法执行了");
        ClassTest classTest = new ClassTest();
         ClassTest classTest2 = new ClassTest();
    }
}

class User{
    public User() {
        System.out.println("user无参构造执行了");
    }
}
![](https://img2024.cnblogs.com/blog/3413037/202405/3413037-20240527164425305-1401906199.png)

4、如果同时存在静态代码块和非静态代码块,以及静态成员变量和非静态成员变量,先执行静态的对象,并且只执行一次,再执行非静态的对象(创建对象),创建多少个对象就会执行多少次

点击查看代码
public class ClassTest {

     User user=new User();

    {
        System.out.println("代码块执行了");
    }

    static {
        System.out.println("静态代码块执行了");
    }

    static User user1=new User();
    
    public static void main(String[] args) {
        System.out.println("main方法执行了");
        ClassTest classTest = new ClassTest();
        ClassTest classTest2 = new ClassTest();
    }
}

class User{
    public User() {
        System.out.println("user无参构造执行了");
    }
}
![](https://img2024.cnblogs.com/blog/3413037/202405/3413037-20240527164625294-725347159.png)
点击查看代码
加入父子级
public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        child.sayHello();
        ((Parent)child).sayHello();

    }
}

class Stub{
    public Stub(String str){
        System.out.println(str + "-object creat");
    }
}

class Parent{
    static Stub parentStaticObject=new Stub("parent static object");
    static {
        System.out.println("parent static code");
    }
    {
        System.out.println("parent code");
    }

    Stub parentStub=new Stub("parent object");

    Stub stub;

    public Parent() {
        System.out.println("parent constructor");
        stub=new Stub("parent constructor create");
    }

    public void sayHello(){
        System.out.println("hello from parent");
    }
}

class Child extends Parent{
    static Stub childStaticObject=new Stub("child static object");
    static {
        System.out.println("child static code");
    }
    {
        System.out.println("child code");
    }

    Stub parentStub=new Stub("child object");

    Stub stub;

    public Child() {
        System.out.println("child constructor");
        stub=new Stub("child constructor create");
    }

    public void sayHello(){
        System.out.println("hello from child");
    }
}
![](https://img2024.cnblogs.com/blog/3413037/202405/3413037-20240527164813006-1413381649.png)

执行流程:
1.首先会加载Parent,则Parent里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)

2.加载Chlid,则Chlid里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)

3.类加载完成后,创建对象,先创建Parent对象,创建对象之前,先创建对象的资源

4.执行Parent构造器,完成对象的创建

5.创建Child对象之前,先创建对象的资源

6.执行Child构造器,完成对象的创建

7.执行sayhello的方法
总结:父类静态字段->父类静态代码块->子类静态字段->子类静态代码块->父类成员变量和非静态块(顺序加载)->父类构造函数->子类成员变量和非静态块(顺序加载)->子类构造函数

posted @   愚昧小生  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示