专栏首页方法论Java中类的静态代码块、构造代码块、构造方法、普通代码块

Java中类的静态代码块、构造代码块、构造方法、普通代码块

前言

Java中静态代码块、构造代码块、构造方法、普通代码块的执行顺序是一个比较常见的笔试题,合理利用其执行顺序也能方便实现项目中的某些功能需求 。

静态代码块

a.定义格式

在Java类(静态代码块不能定义在方法中)中,通过static关键字和{}声明的代码块:

public class Person {
    static{
        System.out.println("静态代码块");
    }
}

b.执行时机

静态代码块在类加载的时候执行,并且仅执行一次,如果一个类中有多个静态代码块,将按照书写顺序执行。

c.静态代码块的作用

一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,就可以都放入静态代码块中。

d.静态代码块不能访问普通成员变量,只能访问静态成员变量

构造代码块

a.定义格式

在Java类中通过{}声明的代码块:

public class Person {
    static{
        System.out.println("静态代码块");
    }
    {
        System.out.println("构造代码块");
    }
}

b.执行时机

构造代码块在类的每次实例化优先于构造方法执行。

c.构造代码块的作用

和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。

  利用每次创建对象的时候都会提前调用一次构造代码块特性,可以做诸如统计创建对象的次数等功能。

构造方法

a.定义格式

构造方法的名称必须与类名完全相同,并且没有返回值。

public class Person {
    public Person(){
        System.out.println("构造方法");
    }
    public Person(String arg){
        System.out.println("构造方法");
    }
}

b.执行时机

构造方法在类的每次实例化时执行。

c.特点

1.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;

  2.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;

  3.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。

普通代码块

普通代码块和构造代码块的区别是,构造代码块是在类中定义的,而普通代码块是在方法体中定义的。且普通代码块的执行顺序和书写顺序一致。

    public void sayHello(){
        {
            System.out.println("普通代码块");
        }
    }

执行顺序

静态代码块>构造代码块>构造方法>普通代码块

代码清单1-1

public class Person {
    static{
        System.out.println("静态代码块");
    }
    {
        System.out.println("构造代码块");
    }
    public Person(){
        System.out.println("构造方法");
    }
    public void sayHello(){
        {
            System.out.println("普通代码块");
        }
    }
    public static void main(String[] args){
        System.out.println("==========实例化a");
        Person a = new Person();
        a.sayHello();
        System.out.println("==========实例化b");
        Person b = new Person();
        b.sayHello();
    }
}

执行结果如图1-1所示:

图1-1 代码清单1-1运行结果

父类和子类执行顺序

  首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有构造代码块,如果有就执行父类的构造代码块,父类的构造代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有构造代码块,如果有就执行子类的构造代码块。子类的构造代码块执行完毕再去执行子类的构造方法。

  总之一句话,静态代码块内容先执行,接着执行父类构造代码块和构造方法,然后执行子类构造代码块和构造方法。

本文分享自微信公众号 - 小诸葛的博客(haibojishu),作者:南风奇缘

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 记一次70后架构师的技术分享会

    上周六,公司请了一位架构师给我们研发的小伙伴做技术分享会,他分别从需求、系统设计、接口设计、代码开发、测试五个方面做了分享,听完他的分享,收获挺多的,下面将自己...

    小诸葛
  • HashMap的常用遍历方式

    在日常开发中,HashMap是一个常用的集合,主要用来存储键值对,那么HashMap有几种遍历方式呢?答案是:五种!在Java8之前有四种,Java...

    小诸葛
  • CI/CD是什么?如何理解持续集成、持续交付和持续部署

    CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决...

    小诸葛
  • 移动云平台的基础架构之旅(二):云代码

    云代码的由来 随着MBaaS的发展,取代移动企业应用程序平台的趋势也越来越明显。MBaaS系统为了让企业能方便快捷的开发自己移动应用程序,提供了诸多移动客户端支...

    CSDN技术头条
  • 程序员请改掉影响你升职加薪的36个坏习惯!

    IT行业的科技公司们一直苦苦追寻传说中以一当十的超级程序员,最新的研究表明确实存在这样一小撮效率奇高的“程序金刚”,但是一位普通程序猿如何能够蜕变成代码金刚呢?

    Java后端技术
  • 学习笔记:因为java匿名类学习到接口的一些小用法

    在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧。 先看一段代码: ? 代码1 这段...

    用户1105954
  • 想要成为顶级程序员必须具备的思维,学会了少走三年弯路

    《THe Effective Engineer》的作者Edmond Lau采访了很多硅谷顶级科技公司的顶尖软件工程师。他发现这些给世界带来巨大影响的的工程师们至...

    用户1257393
  • 程序员提高编程能力万无一失的办法

    那就是去读别人写的代码。读那些你常用的库、编程框架的源代码,读那些你景仰的大牛的源代码,读代码里的测试(测试本身就是一种有效的文档);读代码、改代码、运行代码。...

    企鹅号小编
  • 我是如何学习写代码的?v2

    「 代码 」对于我来说,如同「 设计 」一样,都是为了「 创造 」 出某种产品的一种手段。

    mixlab
  • 顶尖程序员的五种思维模式,你具备吗?

    《THe Effective Engineer》的作者Edmond Lau采访了很多硅谷顶级科技公司的顶尖软件工程师。他发现这些给世界带来巨大影响的的工程师们至...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券