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

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

  要点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. sprig里的controller之间的跳转的问题

    学习spring的controller,发现controller之间的跳转有些地方搞的不是很清楚,如果通过controller的return语句实现跳转的话,会造成request的丢失:具体怎么回事首 ...

  2. web开发流程(传智播客-方立勋老师)

    1.搭建开发环境 1.1 导入项目所需的开发包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar commons-beanutils-1.8.0.jar commons-log ...

  3. sql返回两个日期之间的日期_函数实现

    -- Description:返回两段日期之间的所有日期    <Description,,>-- ============================================ ...

  4. JavaScript数据类型

    当说到JavaScript的数据类型时,好多做了很多年web的朋友甚至还不太清楚.这应该算是最基础的js知识了.我觉得有必要在这记录一下,方便自己和大家查看. 最基本的,js有五种数据类型:undef ...

  5. BAT技巧

    FOR使用 枚举input.txt里的每一行,执行call :dosth %%i(以换行符为分割,默认是空格) for /f "delims=" %%i in (input.txt ...

  6. freeCAD文档结构

    一个freecad文档包含了你场景中的所有物体.它可以包含组及任何工作平台制造的物体.你可以切换工作台,但是它仍然工作在同一个文档上.当您保存您的工作时,该文件就被保存到磁盘上.你可以同时打开多个fr ...

  7. php数组常见的几种遍历方法

    1.foreach遍历 $arr[] = array('first'=>green,'second'=>'yellow','third'=>'blue'); foreach($arr ...

  8. cassandra 公司内分享 ppt

    在公司内分享的cassandra ppt http://files.cnblogs.com/files/yuhan-TB/cassandra.pptx

  9. 解决 emulator-5554 disconnected! Cancelling

    在命令行状态下: adb kill-server ---再adb start-server:

  10. ccs3

    [ 布局 Layout] display:none | intel |block | list-item | inline-block| [ 取值:] onne:隐藏对象.与visibility属性的 ...