学习笔记038——Java类中代码的执行顺序

1、先执行静态代码块

package com.htl.test;

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

在这里插入图片描述

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

package com.htl.test;

public class User {

    public User() {
        System.out.println("User类的无参构造执行");
    }

}
package com.htl.test;

public class Test {

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

    static User user = new User();

    static {
        System.out.println("static执行");
    }

}

在这里插入图片描述

静态代码的执行一定先于 main 方法,静态代码块和静态成员变量的执行顺序是由代码位置决定的,谁写前面就先执行谁。

3、只有在创建Test对象的时候,才会执行非静态代码块和非静态成员变量。

package com.htl.test;

public class Test {

    {
        System.out.println("Code执行");
    }

    User user = new User();

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

}

在这里插入图片描述

package com.htl.test;

public class Test {

    {
        System.out.println("Code执行");
    }

    User user = new User();

    public static void main(String[] args) {
        Test test1 = new Test();
        System.out.println("main执行............");
        Test test2 = new Test();
    }

}

在这里插入图片描述

创建多少个对象,就会执行多少次代码块,创建多少个成员变量。非静态代码块和非静态成员变量的执行顺序是由代码位置决定的,谁写前面谁先执行。

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

package com.htl.test;

public class Test {

    {
        System.out.println("Code执行");
    }

    User user = new User();

    static User user1 = new User();

    static {
        System.out.println("static执行");
    }

    public static void main(String[] args) {
        Test test1 = new Test();
        System.out.println("main执行............");
        Test test2 = new Test();
    }

}

在这里插入图片描述

5、加入父子级情况

package com.htl.test1;

public class Stub {
    public Stub(String str) {
        System.out.println(str + "object created");
    }
}
package com.htl.test1;

public class Father {

    static Stub fatherStaticStub = new Stub("Father static object--");

    static {
        System.out.println("father static code execute");
    }

    Stub fatherStub = new Stub("Father object--");

    {
        System.out.println("father code execute");
    }

    Stub stu;

    public Father() {
        System.out.println("父类 构造器 执行");
        stu = new Stub("Father constructor create object--");
    }

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

}
package com.htl.test1;

public class Son extends Father{

    static Stub sonStaticStub = new Stub("Son static object--");

    static {
        System.out.println("son static code execute");
    }

    Stub sonStub = new Stub("Son object--");

    {
        System.out.println("son code execute");
    }

    Stub stub;

    public Son() {
        System.out.println("子类 构造器 执行");
        stu = new Stub("Son constructor create object--");
    }

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

}
package com.htl.test1;

public class Test1 {

    public static void main(String[] args) {
        Son son = new Son();
        son.sayHello();
        ((Father)son).sayHello();
    }

}

在这里插入图片描述

开始分析:

1、首先会加载 Father,则 Father 中的静态代码块和静态成员变量会优先执行。

2、再加载 Son,则 Son 中的静态代码块和静态成员变量会优先执行。

3、类加载完成后,创建对象,先创建 Father 对象;创建对象之前,先创建对象的资源。

4、执行 Father 构造器,完成对象创建。

5、再创建 Son 对象;创建对象之前,先创建对象的资源。

6、执行 Son 构造器,完成对象创建。

7、执行 sayHello 方法。

尽管进行了强制类型转换,但实际上对象本身还是内存中的子对象,所以 hello 都是来自于 son。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值