文档章节

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

ForingY
 ForingY
发布于 2016/03/01 13:39
字数 521
阅读 63
收藏 1
点赞 1
评论 0

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
博文 252
码字总数 156129
作品 0
杭州
程序员
Java和Android ClassLoder对比以及Class加载过程

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

JasmineBen ⋅ 05/23 ⋅ 0

java基础一(第一个java程序、数据类型、访问控制、static、)

一、第一个java程序 public class HelloWord {//public访问修饰符 class关键字,声明为类 HelloWord类名 //public访问修饰符 static关键字 void表示无返回值 main程序入口 } 二、数据类型 Ja...

废柴 ⋅ 02/11 ⋅ 0

Java中静态域、静态块、非静态域、非静态块、构造函数的执行顺序

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

小鱼儿321 ⋅ 05/30 ⋅ 0

两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义 ⋅ 06/12 ⋅ 0

两道面试题带你解析 Java 类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ } class Father extends Grandpa{ }class Son extends Father{ }public class Initialization...

⋅ 06/13 ⋅ 0

Java中非静态方法可以调用静态方法(反之则不行)的原因

学过Java的同学都知道,非静态方法(不带static)可以访问静态方法(带static),但是反过来就不行,为什么呢?来看下面这个简单例子: public class test{ }public class Test2{ } 这个要从...

qq_39521554 ⋅ 04/30 ⋅ 0

Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀 ⋅ 04/16 ⋅ 0

Java提高——对象与内存控制

实例变量和类变量 Java内存管理分为两个方面:内存分配和内存回收。 内存分配是特指创建Java对象时,JVM为该对象在堆内存中所分配的内存空间 内存回收是指当Java对象失去引用,变成垃圾时,J...

qq_30604989 ⋅ 04/18 ⋅ 0

Java入门学习之java变量简析 java编程

在Java语言中,所有的变量在使用前必须声明。声明变量的基本格式如下: type identifier [ = value][, identifier [= value] ...] ; Java语言支持的变量类型有3种:1、类变量:独立于方法之外...

老男孩Linux培训 ⋅ 05/29 ⋅ 0

Java虚拟机--一个类如何加载?

文末有彩蛋!!!!!! 类加载 对于虚拟机来说,一个对象的创建十分复杂,包含了很多步骤。首先,我们要从类加载说起。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期...

贾博岩 ⋅ 04/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 16分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部