分析java类的静态成员变量初始化先于非静态成员变量

 

依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过

  • 连接

    •   验证:对字节码进行验证
    •   准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值)
    •   解析:类中符号引用转换成直接引用
  • 初始化:为类的静态变量/静态语句块初始化相应的值
  • 使用:   为类的非静态变量/非静态语句块初始化相应的值

而类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况:

  1. 使用new关键字实例化对象时。
  2. 调用某个类的静态方法时。
  3. 读取或设置类的静态字段时(被final修饰、已在编译期把结果放入常量池的除外)。
  4. 使用java.lang.reflect包的方法对类进行反射调用。
  5. 初始化某个类的子类时。
  6. 虚拟机启动时被标明为启动类(包含main方法的类)。

从上面我们知道了静态成员变量的初始化发生在类的 初始化阶段,而要实例化一个对象就必须先去加载、连接、以及初始化该类,才能去使用阶段该类去实例化对象,而非

静态成员变量的初始化发生在对象的实例化过程中。如下例子可以看出当一个类被第一次主动使用静态块或静态成员变量会被初始化。

 1 package com.space.equalstest;
2
3 public class Dog {
4 public static String name = "tom";
5
6 static {
7 System.out.println("Dog init");
8 }
9
10 public static void info() {
11 System.out.println("a dog");
12 }
13 }
1 package com.space.equalstest;
2
3 public class Test {
4 public static void main(String[] args) {
5 Dog.info();//首次主动使用进行初始化
6 Dog.info();//不会再去初始化
7 }
8 }

输出结果:

1
2
3
Dog init
a dog
a dog

  

分析java类的初始化契机的更多相关文章

  1. 分析java类的静态成员变量初始化先于非静态成员变量

    依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,sta ...

  2. 图示Java类的初始化顺序

    Java类的初始化顺序   在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行.   以下为代码验证阶段,一共三个类 ...

  3. java类的初始化和构造函数

    本人小白一枚,看java类的初始化的时候好晕的说,我觉着书上尽管说的对.但总认为有些信息没说出来,没说清楚,看了好多文章博客的,如今有些感悟,来小写下总结,也算是为以后再次复习种个好果子. 先摘一下书 ...

  4. java类的初始化顺序

    在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图: 一.单类(无基类)下的初始化顺序: public class Parent { stat ...

  5. java类的初始化和对象的创建顺序

    学习java编程思想--类的初始化p146 类的加载顺序* 1加载器启动找到 xxx.class文件,通过extends关键字寻找基类,先加载基类* 2类初始化先初始化static成员变量和stati ...

  6. Red5源代码分析 - 关键类及其初始化过程

    原文地址:http://semi-sleep.javaeye.com/blog/348768 Red5如何响应rmpt的请求,中间涉及哪些关键类? 响应请求的流程如下: 1.Red5在启动时会调用RT ...

  7. [Java] 类的初始化步骤

    前言 类的初始化过程,可在多线程环境下进行的,为了简化,本文介绍的单线程情况下的类初始化步骤. 此外,继承情况下的顺序不是本文焦点,本文重点在于一个类的内部字段的初始化顺序.想了解继承情况下的初始化情 ...

  8. java类的初始化

    转载:http://blog.csdn.net/moreevan/article/details/6968718 我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程.下面先对这三 ...

  9. Java类的初始化与实例对象的初始化

    Java对象初始化详解 2013/04/10 · 开发 · 1 评论· java 分享到:43 与<YII框架>不得不说的故事—扩展篇 sass进阶篇 Spring事务管理 Android ...

随机推荐

  1. GridView 控制默认分页页码间距 及字体大小

    GridView 控制默认分页页码间距 及字体大小 PagerCss TD A:hover { WIDTH: 20px; COLOR: black; padding-left: 4px; paddin ...

  2. [置顶] 滴滴插件化VirtualAPK框架原理解析(二)之Service 管理

    在前一篇博客滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理 中VirtualAPK是如何对Activity进行管理的,本篇博客,我们继续来学习这个框架,这次我们学习的是如何 ...

  3. Failed to resolve: com.android.support:appcompat-v7:27.+ 报错解决方法

    最近在学习Android方面的编程,这个过程中出现了许多的错误,其中最多的错误是出现在构建工具进行编译的时候.这里分析一个出现的错误,Failed to resolve: com.android.su ...

  4. UITableview优化随笔(1)-提高加载更多内容时的效率

    UITableView上拉加载更多的功能相信很多应用都会用到,类似朋友圈.微博这样的应用,tableView中的数据内容高度根据内容来变化,同时需要加载大量的数据(上拉加载更多),要怎样才能保证加载数 ...

  5. BZOJ2199 奶牛议会 【2-sat】

    BZOJ2199 奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以"每头牛 都可以获得自己想要的"为原则, ...

  6. 《DSP using MATLAB》示例Example 8.30

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

  7. WCF Restful Post调用

    一.首先建立Http的服务端,此示例的寄宿体为WindowsService,以下代码仅为WCF Restful服务代码,不包括服务启动和安装代码 1.服务契约 /// <summary> ...

  8. fabio 安装试用&&实际使用的几个问题

    备注:    因为fabio 依赖consul vault (不是强需),启动之前需要先安装consul,    本次为了简单consul 使用的是单机,使用的是dev 模式   1. conusl ...

  9. uuid 了解

    什么是UUID? UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符.UUID具有以下涵义: 经由一定的算法 ...

  10. 7个GIF动图帮你瞬间理解三角函数

    7个GIF动图帮你瞬间理解三角函数 蝌蚪五线谱 百家号04-2120:53 图片来源:IMGUR 三角函数是数学中研究三角形的一个分支,专门阐述三角形的角度和对应边的关系. 有趣的是,定义边角关系的三 ...