文档章节

Java 静态(static)与非静态语句执行顺序

ForingY
 ForingY
发布于 2016/03/01 13:39
字数 521
阅读 77
收藏 1

Java中的静态(static)关键字只能用于成员变量或语句块,不能用于局部变量

static 语句的执行时机实在第一次加载类信息的时候(如调用类的静态方法,访问静态成员,或者调用构造函数), static 语句和 static 成员变量的初始化会先于其他语句执行,而且只会在加载类信息的时候执行一次,以后再访问该类或new新对象都不会执行

而非 static 语句或成员变量,其执行顺序在static语句执行之后,而在构造方法执行之前,总的来说他们的顺序如下

1. 父类的 static 语句和 static 成员变量

2. 子类的 static 语句和 static 成员变量

3. 父类的 非 static 语句块和 非 static 成员变量

4. 父类的构造方法

5. 子类的 非 static 语句块和 非 static 成员变量

6. 子类的构造方法

参见如下例子

Bell.java

public class Bell {    public Bell(int i) {
        System.out.println("bell " + i + ": ding ling ding ling...");
    }
}

Dog.java

public class Dog {
    // static statement
    static String name = "Bill";

    static {
        System.out.println("static statement executed");
    }

    static Bell bell = new Bell(1);

    // normal statement
    {
        System.out.println("normal statement executed");
    }

    Bell bell2 = new Bell(2);

    static void shout() {
        System.out.println("a dog is shouting");
    }

    public Dog() {
        System.out.println("a new dog created");
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        // static int a = 1; this statement will lead to error
        System.out.println(Dog.name);
        Dog.shout();    // static statement would execute when Dog.class info loaded
        System.out.println();
        new Dog();  // normal statement would execute when construct method invoked
        new Dog();
    }
}

程序输出:

static statement executed
bell 1: ding ling ding ling...
Bill
a dog is shouting
normal statement executed
bell 2: ding ling ding ling...
a new dog created
normal statement executed
bell 2: ding ling ding ling...
a new dog created

可见第一次访问Dog类的static成员变量name时,static语句块和成员变量都会初始化一次,并且在以后调用static方法shout()或构造方法时,static语句块及成员变量不会再次被加载

而调用new Dog()构造方法时,先执非static语句块和成员变量的初始化,最后再执行构造方法的内容


© 著作权归作者所有

共有 人打赏支持
ForingY
粉丝 23
博文 272
码字总数 156129
作品 0
杭州
程序员
私信 提问
静态代码块、非静态代码块、构造方法的执行顺序

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下: static { 静态语句代码块 } { 非静态语句代码块 } 异同点 相同点...

IT-Dennis
2015/08/11
0
0
类装载步骤

类装载步骤 在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的...

北极之北
2016/03/10
138
0
JAVA final finally finalize区别

简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符。 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被...

qq22734179
2014/03/21
0
0
Java和Android ClassLoder对比以及Class加载过程

Java的ClassLoder的父子关系如下:Bootstrap--ExtClassClassLoader---AppClassLoader。 JVM启动时先运行启动类加载器Bottstrap,主要加载Java核心API;然后加载扩展类加载器ExtClassLoder,该...

JasmineBen
05/23
0
0
Java中静态域、静态块、非静态域、非静态块、构造函数的执行顺序

在Java类被new的过程中,执行顺序如下: 实现自身的静态属性和静态代码块。(根据代码出现的顺序决定谁先执行) 实现自身的非静态属性和非静态代码块。 执行自身的构造函数。 在实现继承的类...

小鱼儿321
05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
23分钟前
1
0
想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜

本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事。有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况。于是周榜(按周重置更新...

腾讯云加社区
25分钟前
2
0
函数计算性能福利篇(二) —— 业务冷启动优化

继前一篇《函数计算性能福利篇——系统冷启动优化》,我们再来看看近期函数计算推出的 Initializer 功能之后,带来的一波高能性能优化成果。 背景 函数计算是一个事件驱动的全托管 serverle...

阿里云官方博客
31分钟前
1
0
开源版本说明

1527
32分钟前
2
0
Mysql经验-------持续更新

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

DoLo-lty
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部