前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 静态块、构造块、构造函数执行顺序

Java 静态块、构造块、构造函数执行顺序

作者头像
pydata
发布于 2018-08-02 04:03:33
发布于 2018-08-02 04:03:33
1.8K00
代码可运行
举报
文章被收录于专栏:pydatapydata
运行总次数:0
代码可运行

Java代码行执行顺序:

1.静态块:用static声明,JVM加载类时执行,仅执行一次 2.构造块:类中直接用{}定义,每次创建对象时执行 3.执行顺序优先级:静态块>main()>构造块>构造方法 4.静态块和静态属性优先执行,谁在前先执行谁。

出现继承时:

1.初始化父类的静态变量、静态代码块,初始化的顺序按照出现的顺序。 2.初始化子类的静态变量,静态代码块。 3.初始化父类的成员变量。 4.执行父类的构造函数。 5.初始化子类的成员变量。 6.构造代码块创建对象时执行 7.执行子类的构造函数。

代码测试及验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
////Father.java
package com.test;

public class Father {
    protected int n = 5;
    protected static int m = 5;
    public static Father p = new Father();
    public static Father p1 = new Father();

    {//构造块
        n = n * 2;
        m = m * 2;
        System.out.print("父类**构造块**调用;");
        System.out.print("n="+n);
        System.out.println("  m="+m);
    }

    static {//实例化多个对象时,静态块只执行一次,即在第一个实例化对象时执行
        m = m * 2;
        System.out.println("父类%%静态块%%调用; m="+m);
    }


    public Father() {  //父类构造函数
        this.n = n * 10;
        m = m + 10;
        System.out.print("父类$$构造函数$$;   n="+n);
        System.out.println("    m="+m);
    }
}

//Son.java
package com.test;

public class Son extends Father {
    private int sn=3;
    private static int sm=3;
    static {
        m = m + 2;
        sm=sm+2;
        System.out.println("【 子类 】@@ 静态块 @@调用;    m="+m);
    }
    {
        n = n + 2;
        sn=sn+2;
        m = m + 2;
        System.out.println("【 子类 】^^ 构造块 ^^调用;");
        System.out.println("n="+n);
        System.out.println("sn="+sn);
        System.out.println("m="+m);
    }

    public Son() {
        this.n = n + 10;
        sn=sn+10;
        m = m + 10;
        System.out.println("【 子 类 】[[ 构造函数 ]];\nn="+n);
        System.out.println("m="+m);
    }
}

//Main.java
import com.test.Father;
import com.test.Son;

public class Main {

    public static void main(String[] args)
    {


                new com.test.Father();
                new Son();


        System.out.println("Hello World!");
    }
}

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    父类**构造块**调用;n=10  m=10
    父类$$构造函数$$;   n=100    m=20
    父类**构造块**调用;n=10  m=40
    父类$$构造函数$$;   n=100    m=50
    父类%%静态块%%调用; m=100
    父类**构造块**调用;n=10  m=200
    父类$$构造函数$$;   n=100    m=210
    【 子类 】@@ 静态块 @@调用;    m=212
    父类**构造块**调用;n=10  m=424
    父类$$构造函数$$;   n=100    m=434
    【 子类 】^^ 构造块 ^^调用;
    n=102
    sn=5
    m=436
    【 子 类 】[[ 构造函数 ]];
    n=112
    m=446
    Hello World!

如果做如下调整: 结果(二):【将main()函数的new Son()注释掉的运行结果】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
**父类**构造块**调用;n=10  m=10
父类$$构造函数$$;   n=100    m=20
父类**构造块**调用;n=10  m=40
父类$$构造函数$$;   n=100    m=50
父类%%静态块%%调用; m=100
父类**构造块**调用;n=10  m=200
父类$$构造函数$$;   n=100    m=210**

结果(三):【将Father类中的两个引用p、p1注释掉的运行结果,结果二中的new Son();也注释掉】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
父类%%静态块%%调用; m=10
父类**构造块**调用;n=10  m=20
父类$$构造函数$$;   n=100    m=30

结果(四):【将Father类中的两个引用p、p1注释掉的运行结果,结果二中的new Son();不注释掉】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
父类%%静态块%%调用; m=10
父类**构造块**调用;n=10  m=20
父类$$构造函数$$;   n=100    m=30
【 子类 】@@ 静态块 @@调用;    m=32
父类**构造块**调用;n=10  m=64
父类$$构造函数$$;   n=100    m=74
【 子类 】^^ 构造块 ^^调用;
n=102
sn=5
m=76
【 子 类 】[[ 构造函数 ]];
n=112
m=86   ### 输出结果解析:  
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年07月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java父类,子类静态块和构造方法的执行顺序
一个面试笔试题中没什么什么卵用但经常出的题,父类,子类静态块和构造方法的执行顺序 package com.gulf.test; public class Father { public Father(){ System.out.println("父类构造方法"); } static { System.out.println("父类静态块"); } } package com.gulf.test; public class Son extends Father { publi
用户1220053
2018/02/09
1.2K0
java的静态属性,静态块,构造函数的执行顺序
今天为了搞清楚实例化一个对象时其属性等的实例化顺序,写了下面的例子来探究: 实例化一个C的对象,其中,A为其静态属性,B为其普通属性;D为C的父类,E为D的静态属性,F为D的普通属性;C中还包含了静态代码块和普通代码块。 package com.yawn; public class Test3 { public static void main(String[] args) { System.out.println("-------第1次实例化-------"); new C(); Sys
yawn
2018/03/14
1.1K0
java 构造函数是如何执行的「建议收藏」
原因1:方法的话,会直接执行方法体内的代码,但是构造函数首先执行的不是{}里的代码块,而是给对象的成员初始化;
全栈程序员站长
2022/09/15
9000
java 构造函数是如何执行的「建议收藏」
Java代码块执行顺序初探
Java继承中对构造函数是不继承的,只是显式或者隐式调用,并且必须是在构造函数第一行。这里是隐式调用了super()。
WindCoder
2018/09/19
2.7K0
Java中静态代码块、构造代码块、构造函数、普通代码块
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
Fisherman渔夫
2019/07/31
1.7K0
Java中静态代码块、构造代码块、构造函数、普通代码块
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑
各位小伙伴大家好,我是A哥。如果问:Java的三大特性是什么?你顺口就能答出:封装、继承、多态。如果继续问:你真的了解Java中的继承吗?
YourBatman
2022/05/06
1K0
静态代码块、静态变量,构造代码块、实例变量的执行顺序和继承逻辑
static静态代码块加载和执行
静态代码块,非静态代码块,无参构造,有参构造,这些代码片段分别在什么时候加载执行?
IT云清
2019/01/22
5920
【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)
实际上要去判断一个类的初始化的顺序,需要分一下情况,一种是没有继承关系的类(不考虑Object类),一种是有继承关系的类。
哈__
2024/04/10
4610
【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)
java_自由块(静态块和非静态块)
java中的自由块分为两种: 静态块和非静态块 静态块: 1 public class Test { 2 static int x = 10; 3 //静态块:静态块的执行时机是在class文件装载的时候;静态块只会执行一次 4 //多个静态块的时候,按出现顺序执行 5 static{ 6 x+=5; 7 } 8 } 非静态块: 1 public class Test { 2 //非静态块:每次初始化一个对象,都会导致一次非静态块的执行;在构造
Hongten
2018/09/13
1.1K0
静态代码块、构造代码块以及构造函数的加载顺序
首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。
week
2018/08/24
7570
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
诚如各位所知,java的三大特性:封装、继承、多态。其中继承,是java中最有学问的一点也是最相对来说最难理解的一些东西,本文针对于此,做一些实例分析,希望能够帮助大家理解java中的继承机制
YourBatman
2019/09/03
1.5K0
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
Java基础-08(01)总结帮助文档,代码块,继承
1:如何制作帮助文档(了解) (1)写一个类 (2)加入文档注释 (3)通过javadoc工具生成即可 javadoc -d 目录 -author -version ArrayTool.jav
Java帮帮
2018/03/15
8340
Java基础-08(01)总结帮助文档,代码块,继承
夯实Java基础系列7:一文读懂Java 代码块和执行顺序
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/27
6390
子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数
用户9854323
2022/06/25
2.2K0
java中带继承类的加载顺序详解及实战
  在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩固!
阿豪聊干货
2018/08/09
4780
java中带继承类的加载顺序详解及实战
举例说明Java中代码块的执行顺序
可以看到,静态代码块只在类加载时执行一次,在main方法之前执行。实例代码块在每次创建对象时执行,然后再执行构造方法。
用户10604450
2024/03/15
1210
java类的初始化顺序
了解类的初始化顺序对于编写正确的Java代码是非常重要的,尤其java是完全面向对象的语言,类作为整个程序编写的单位。 构造方法 静态实例变量 实例变量 静态块 实例块
lexingsen
2022/02/24
3980
java类的初始化顺序
【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,A a = new A();则父类B的构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块执行的先后顺序是什么?
凯哥Java
2022/12/02
6910
【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
为什么不允许使用 Java 静态构造函数?
不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。
淡定的蜗牛
2019/10/28
3.2K0
java继承的调用顺序
加入了子类以后,执行顺序有了新的变化,我们可以总结一下。首先第一部分执行的是父类的静态代码块—子类的静态代码块—主程序。这一部分都是执行一次,与建立多少对象没有关系。第二部分new了一个父类对象,并调用了方法。执行了它的非静态代码块—构造函数—一般方法。第三部分new了一个子类的对象,并调用了方法。执行顺序为父类的非静态代码块—父类的无参构造函数,然后是子类的非静态代码块—子类构造函数—子类的方法。
用户7043603
2022/02/27
8340
推荐阅读
相关推荐
java父类,子类静态块和构造方法的执行顺序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验