JAVA在创建对象之前,是先加载类,然后再创建对象。

加载类时,会加载静态的成员变量,包括父类的静态成员变量[先加载父类,再加载子类]。

一、  静态成员变量的初始化

 package com.cnblog.GDUTtiantian.init;

 /**
  * @author GDUTtiantian
  * 静态成员变量的初始化
  */
 public class StaticInit {
     private static StaticInit s = new StaticInit();//
     private static int index = 0;
     private static String ptr;

     static {//第一个静态代码块
         index = 1;
         ptr = name = "newname.";
         //System.out.println("name:" + name);//这里编译时会报错:Cannot reference a field before it is defined
         System.out.println("name:" + ptr);
         System.out.println("The " + index + " Code Block.");
     }

     private static String name = "GDUTtiantian";

     static {//第二个静态代码块
         index = 2;
         System.out.println("name:" + name);
         System.out.println("The " + index + " Code Block.");
     }

     public StaticInit(){
         System.out.println("Constructor:" + this.getClass().getSimpleName());
     }

     public static void main(String[] args) {
         System.out.println("------------------");
         StaticInit s = new StaticInit();
         System.out.println("------------------");
     }

     static {//第三个静态代码块
         index = 3;
         System.out.println("The " + index + " Code Block.");
     }

 }

运行结果:

 Constructor:StaticInit
 name:newname.
 The 1 Code Block.
 name:GDUTtiantian
 The 2 Code Block.
 The 3 Code Block.
 ------------------
 Constructor:StaticInit
 ------------------

二、   静态成员变量和非静态成员变量的初始化

 package com.cnblog.GDUTtiantian.init;

 /**
  * @author GDUTtiantian
  * 静态成员变量和非静态成员变量的初始化
  */
 public class StaticInit2 {
     //private static Static2 s = new Static2();//
     private static int index = 0;
     private static String ptr;

     {//第一个【非】静态代码块
         //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。
         this.flag = "GDUT";
         System.out.println("[非静态变量初始化]:代码块1");
     }

     {//第两个【非】静态代码块
         System.out.println("[非静态变量初始化]:代码块2");
     }

     private String flag = "tiantian";

     static {//第一个静态代码块
         index = 1;
         ptr = name = "newname.";
         //System.out.println("name:" + name);//这里编译时会报错:Cannot reference a field before it is defined
         System.out.println("name:" + ptr);
         System.out.println("The " + index + " Code Block.");
     }

     private static String name = "GDUTtiantian";

     static {//第二个静态代码块
         index = 2;
         System.out.println("name:" + name);
         System.out.println("The " + index + " Code Block.");
     }

     public StaticInit2(){
         System.out.println("Constructor:" + this.getClass().getSimpleName());
     }

     public static void main(String[] args) {
         System.out.println("------------------");
         StaticInit2 s = new StaticInit2();
         System.out.println("------------------");
     }

     static {//第三个静态代码块
         index = 3;
         System.out.println("The " + index + " Code Block.");
     }

     {//第三个【非】静态代码块
         System.out.println("[非静态变量初始化]:代码块3");
     }

 }

运行结果:

 name:newname.
 The 1 Code Block.
 name:GDUTtiantian
 The 2 Code Block.
 The 3 Code Block.
 ------------------
 [非静态变量初始化]:代码块1
 [非静态变量初始化]:代码块2
 [非静态变量初始化]:代码块3
 Constructor:StaticInit2
 ------------------

三、  总结:

还有一种情况是,父类和子类的成员变量的初始化情况,父类含有静态和非静态成员变量,子类也含有静态和非静态成员变量。

在这种情况下,会先初始化父类的静态成员变量,然后再是子类的静态成员变量;      <-----【静态成员变量初始化】

接着初始化父类的非静态成员变量,最后是子类的非静态成员变量。   <------【非静态成员变量初始化】

补充:

JVM执行初始化操作时,非构造方法外面的非静态初始化代码(块),都会被加载到构造方法中,放在其他代码的最前面;

接着是父类的构造方法,子类显式/隐式调用父类的构造方法,而且父类构造方法是放在子类构造方法的首行,如果不存在对应的父类构造方法,则会编译出错。

欢迎讨论交流, 我的主页:http://www.cnblogs.com/GDUT/

我的邮箱:zone.technology.exchange@gmail.com

JAVA的初始化顺序(续)的更多相关文章

  1. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  2. JAVA的初始化顺序:

    JAVA的初始化顺序: 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造 ...

  3. java 继承 初始化顺序

    面向对象三大特性: 封装,继承,多态 java 继承初始化顺序 先初始化父类对象, 在父类对象中先初始化父类属性,再初始化父类的构造方法,然后初始化子类对象,初始化子类对象的属性,初始化子类的构造方法 ...

  4. 【知识总结】Java类初始化顺序说明

    微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...

  5. java继承 初始化顺序

    java继承 初始化顺序 标签: 初始化顺序 2013-08-01 10:13 879人阅读 评论(0) 收藏 举报  分类: java(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  6. Java变量、Java对象初始化顺序

    局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量 ...

  7. Java对象初始化顺序

    最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test;   public class Upper { String upperSt ...

  8. Android(java)学习笔记136:Java类初始化顺序

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

  9. 【细说Java】Java变量初始化顺序

    Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考 ...

随机推荐

  1. CGContextRef 绘图

    如何绘制一个矩形 添加一个属性 @property(nonatomic,strong) NSString* RectNumber; 1. 首先重写UIview的drawRect方法 - (void)d ...

  2. 9.S5PV210的时钟系统

    1.时钟域:MSYS.DSYS.PSYS(1)因为S5PV210的时钟体系比较复杂,内部外设模块太多,因此把整个内部的时钟划分为3大块,叫做3个域.(2)MSYS: CPU(Cortex-A8内核). ...

  3. Spark 集群安装

    一.安装jdk 二.安装scala 三.安装Spark 1.解压 tar -zxvf spark-1.5.1-bin-hadoop2.6.tgz 2.cp spark-env.sh.template ...

  4. 26、首先通过javascript包的异步加载来学习echarts包的结构

    1.在这里先写一写前言,今天在公司搞定了一个对于滚动条进行定位的case,明天开始做TestManagement. 首先大家先来一起看一看流行的javascript文件的加载方式,这里采用别人博客上的 ...

  5. Eclipse相关设置

    eclipse 默认设置的换行长度, 格式化代码后,同一个方法里面参数也经常被,换行,非常难看. 1.Java代码打开Eclipse的Window菜单,然后 Preferences->Java- ...

  6. CSS BOX模型

    对于box模型概念的理解以及它与决定元素最终尺寸的方式有何关系,是理解如何设定网 页上的元素位置的基础.box模型应用到块级元素.一个随之而来的概念,内联布局模型 定义了如何设定内联元素的位置. 对于 ...

  7. linux crontab命令参数及用法详解--linux自动化定时任务cron

    声明:本文转自Linux 安全网,在此基础上加上自己的体会! crontab 命令 如果发现您的系统里没有这个命令,在ubuntu server 中用的是 sudo apt-get install c ...

  8. 学习笔记001之[Android开发视频教学].01_15_Handler的使用(二)

    Handler 与线程 Bundle 的用法 在线程中处理消息的方法 待补充......

  9. LINK : fatal error LNK1104: 无法打开文件“gtestd.lib”

    解决办法: 复制编译出来的gtestd.lib文件到D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib目录下 我这里用的是vs2015 ...

  10. [原创] Legato 8.1 oracle full backup skip 奇怪的问题处理过程 -- 非调度日期手工运行调度也不成功(skip)

    转载请注明出处: http://www.cnblogs.com/fengaix6/p/4677024.html 作者:飄ぺ風 环境: a. Server: Legato 8.1.2, aix 6.1 ...