对于单一类:
  属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性)
  ---> 按顺序执行初始化块 ---> 构造方法

  对于存在继承关系的类:
  父类属性初始化 ---> 按顺序执行父类静态初始化块 ---> 按顺序执行子类初始化块
  ---> 按顺序执行父类普通初始化块 ---> 父类构造方法
  ---> 按顺序执行子类普通初始化块 ---> 子类构造方法

  要点1:对于静态初始化块,无论声明多少次对象,只会执行一次
  要点2:在主函数之前,会优先桉顺序执行所在类(代码中的Test类)的静态初始化块,之后才执行主函数的内容

参考代码:

以下是包含main函数的Test类

package com.hao;

class Test{

    //数据成员
static int a = 1; //普通初始化块1
{
System.out.println("Test类普通初始化块1"); } //静态初始化块1
static{
System.out.println("Test类静态初始化块1");
} //普通初始化块2
{
System.out.println("Test类普通初始化块2");
} //构造方法
Test(){
System.out.println("Test类构造方法");
} //普通初始化块3
{
System.out.println("Test类普通初始化块3");
} //静态初始化块2
static{
System.out.println("Test类静态初始化块2");
} public static void main(String[] args) {
// TODO 自动生成的方法存根 //在主函数之前,会优先桉顺序执行所在类的静态初始化块,之后才执行主函数的内容
System.out.println("Hello,World");
Animal a = new Dog();
Animal b = new Dog();
// Test a = new Test();
// Test b = new Test(); } }//Test

以下是父类Animal的代码内容:

package com.hao;

public class Animal {

    static int a = 11;

    /*
* 可观察得到a的变化情况为 11 14 16 13 15 12
*/ //父类构造方法
Animal(){
System.out.println("父类构造方法");
System.out.printf("%d ---> ", a);
a = 12;
System.out.println(a);
} //父类普通初始化块1
{
System.out.println("父类普通初始化块1:");
System.out.printf("%d ---> ", a);
a = 13;
System.out.println(a);
} //父类静态初始化块1
static{
System.out.println("父类静态初始化块1");
System.out.printf("%d ---> ", a);
a = 14;
System.out.println(a);
} //父类普通初始化快2
{
System.out.println("父类普通初始化块2");
System.out.printf("%d ---> ", a);
a = 15;
System.out.println(a);
} //父类静态初始化块2
static{
System.out.println("父类静态初始化块2");
System.out.printf("%d ---> ", a);
a = 16;
System.out.println(a);
} }//Animal

以下是子类Dog的代码内容:

package com.hao;

public class Dog extends Animal {

    //子类中的a变化顺序为 12->23->25->22->24->21 

    //子类构造方法
Dog(){
System.out.println("子类构造方法");
System.out.printf("%d ---> ", a);
a = 21;
System.out.println(a);
} //子类普通初始化块1
{
System.out.println("子类普通初始化块1");
System.out.printf("%d ---> ", a);
a = 22;
System.out.println(a);
} //子类静态初始化块1
static{
System.out.println("子类静态初始化块1");
System.out.printf("%d ---> ", a);
a = 23;
System.out.println(a);
} //子类普通初始化块2
{
System.out.println("子类普通初始化块2");
System.out.printf("%d ---> ", a);
a = 24;
System.out.println(a);
} //子类静态初始化块2
static{
System.out.println("子类静态初始化块2");
System.out.printf("%d ---> ", a);
a = 25;
System.out.println(a);
} }

上述代码a的值的变化顺序依次为  11 14 16 23 25 13 15 12 22 24 21 (这里开始是第二个对象的了) 13 15 12 22 24 21

Java中类的数据成员的初始化顺序的更多相关文章

  1. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  2. java类中成员的初始化顺序(一)

    类被创建之后的成员的初始化顺序到底是怎么样的? 首先 不考虑继承 package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 ...

  3. Java语法专题2: 类变量的初始化顺序

    合集目录 Java语法专题2: 类变量的初始化顺序 问题 这也是Java面试中出镜率很高的基础概念问题 描述一下多级继承中字段初始化顺序 描述一下多级继承中类变量初始化顺序 写出运行以下代码时的控制台 ...

  4. Java中类成员变量初始化顺序

    一. 定义处默认初始化vs构造函数中初始化 java中类成员变量支持在声明处初始化,也可以在构造函数中初始化,那么这两者有什么区别呢?看下面例子 public class FieldsInit { p ...

  5. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  6. 【java虚拟机系列】java中类与对象的加载顺序

    首先了解一下Java虚拟机初始化的原理. JVM通过加装.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.类型的生命周期如下图所示: 装载和连接必须在初始化之前就要完成. 类 ...

  7. C++中默认构造函数中数据成员的初始化

    构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据 ...

  8. java类的加载以及初始化顺序

    类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classl ...

  9. C++成员变量初始化顺序问题

    由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void P ...

随机推荐

  1. Oracle查询表空间使用情况

    --查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...

  2. Linux学习 :中断处理机制 & poll机制

    中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务 的程序中去,服务完毕后再返回去继续运行被暂时中断的程序 ...

  3. DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版

    关于 DotNetBar for Windows Forms 11.8.0.8_冰河之刃重打包版 基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DL ...

  4. NPOI 2.0 读取、编辑、保存Excel文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  5. 如何在Outlook中打开后缀 .eml 的附件

    引用:http://jingyan.baidu.com/article/6fb756ec82c301241858fb1e.html

  6. java语法基本知识3--this

    this一般是出现在class中的方法中.同过new产生了一个对象,this就指向这个对象.

  7. LED BIN code

    在LED选型时,一开始我们都知道要选个某种颜色,在选个尺寸,但在到具体选的时候,就会被那些个各种各样的参数搞得迷糊,这个主要对一个最让人困惑的参数-BIN CODE做整理. BIN就是bining的缩 ...

  8. Myeclipse闪退故障

    Myeclipse在编辑代码是出现反复一个异常错误. Index out of bounds,而且窗口关闭后还是出现, 于是在任务管理器里强制关闭MyEclipse. 关闭后启动MyEclipse总是 ...

  9. win8设置保护眼睛的颜色

    win8下打开注册表编辑器(win键+R,即运行,输入regedit),依次双击打开HKEY_CURRENT_USER\Control Panel\Colors\,将Window的键值修改为204 2 ...

  10. JavaScript onblur 和 onkeyup事件用法

    1.onblur表示失去焦点的时候被调用: 2.onkeyup表示键盘每输入完一个字符之后发生.简单来讲,就是键盘上的按键被放开的时候触发. 例子: <!DOCTYPE HTML PUBLIC ...