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

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

  要点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. CDHtmlDialog的基本使用

    转自:http://blog.csdn.net/sky04/article/details/7587406 因为我的部门只有我一个人(无奈之极,只有我一个做C++的,其他的都在做C#),所以我去跟技术 ...

  2. java基础之 多态

    在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言 ...

  3. 64位计算机安装setuptool

    Python Version 2.7 required, which was not found in the registry 新建注册表信息:HKEY_LOCAL_MACHINE\SOFTWARE ...

  4. C++多线程1

    一个多线程的实例 #include "stdafx.h" #include <windows.h> DWORD __stdcall Func(LPVOID pm) { ...

  5. java学习笔记(菜鸟原创)

    搭建Java开发环境使用开发工具开发Myeclipse基础核心:JAVASEEEME面向对象 API JVM.JAVAEE是指java enterprise edition,java企业版,多用于企业 ...

  6. web 页面上纯js实现按钮倒计数功能

    需求构思:本功能想实现的是,一个按钮在页面载入就显示提醒续费,,,倒数60秒后,完成提醒功能,可以按另外一个页面跳转到主页. 参考网上的大神,实现如下:Button2倒数,Button3跳转,在页面上 ...

  7. response设置相应头的方法

    response 设置响应头的常用几种方法 1.Location 的用法 response.setStatus(302)//临时定向响应码 response.setHeader("Locat ...

  8. javascript获取asp.net服务器端控件的值

    代码如下: <%@ Page Language="C#" CodeFile="A.aspx.cs" Inherits="OrderManage_ ...

  9. 2016 - 3 - 12 SQLite的学习之SQL语言入门

    1.SQL语句的特点: 1.1 不区分大小写 1.2 每条语句以;结尾 2.SQL语句中常用关键字: select,insert,update,from,create,where,desc,order ...

  10. Unity Ugui射线坐标转换总结

    世界空间中的点坐标转换到屏幕坐标: screenPos = RectTransformUtility.WorldToScreenPoint(cam, worldPos.transform.positi ...