1  无继承情况下的Java初始化顺序:

class Sample
{
      Sample(String s)
      {
            System.out.println(s);
      }
      Sample()
      {
            System.out.println("Sample默认构造函数被调用");
      }
}
class Test{
      static Sample sam=new Sample("静态成员sam初始化");
      Sample sam1=new Sample("sam1成员初始化");
      static{
            System.out.println("static块运行");
            if(sam==null)System.out.println("sam
is null");
            sam=new Sample("静态块内初始化sam成员变量");
            }
      Test()
      {
            System.out.println("Test默认构造函数被调用");
      }
}
//主函数
 public static void 
main(String  str[])
{
     Test a=new Test();
 }
输出结果为:
静态成员sam初始化     -----静态成员初始化
static块运行          -----静态块被运行
静态块内初始化sam成员变量 ----静态块运行
sam1成员初始化      -----普通成员初始化
Test默认构造函数被调用  -----构造函数运行
由此能够得出结论:
a 静态成员变量首先初始化(注意。Static能够看做一个静态成员。其运行顺序和其在类中申明的顺序有关)
b 普通成员初始化
c 运行构造函数。
对于静态成员(static块能够看成普通的一个静态成员,其并不一定在类初始化时首先运行)和普通成员。其初始化顺序仅仅与其在类定义中的顺序有关,和其它因素无关。

比如以下的样例:
class Test{
      static{
            System.out.println("static
块 1  运行");
            }
      static Sample staticSam1=new Sample("静态成员staticSam1初始化");
      Sample sam1=new Sample("sam1成员初始化");
      static Sample staticSam2=new Sample("静态成员staticSam2初始化");
      static{
            System.out.println("static
块 2  运行");
            }
      Test()
      {
            System.out.println("Test默认构造函数被调用");
      }
      Sample sam2=new Sample("sam2成员初始化");
}
则结果为:
static 块 1  运行
静态成员staticSam1初始化
静态成员staticSam2初始化
static
块 2  运行 
  
                   --------静态成员
sam1成员初始化
sam2成员初始化
  
                   --------普通成员
Test默认构造函数被调用
  
                   --------构造函数
2 Java继承情况下的初始化顺序:
class Test{
      static{
            System.out.println("父类static
块 1  运行");
            }
      static Sample staticSam1=new Sample("父类
静态成员staticSam1初始化");
      Sample sam1=new Sample("父类
sam1成员初始化");
      static Sample staticSam2=new Sample("父类
静态成员staticSam2初始化");
      static{
            System.out.println("父类
static 块 2  运行");
            }
      Test()
      {
            System.out.println("父类
Test默认构造函数被调用");
      }
      Sample sam2=new Sample("父类
sam2成员初始化");
}
class TestSub extends Test
{
      static Sample staticSamSub=new Sample("子类
静态成员staticSamSub初始化");
      TestSub()
      {
            System.out.println("子类
TestSub 默认构造函数被调用");
      }
      Sample sam1=new Sample("子类
sam1成员初始化");
      static Sample staticSamSub1=new Sample("子类
静态成员staticSamSub1初始化");
      
      static{System.out.println("子类
static 块  运行");}
      Sample sam2=new Sample("子类
sam2成员初始化");
}
运行结果:
父类 static
块 1  运行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2  运行
                      
 --------父类静态成员初始化
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块  运行
                      
 -------子类静态成员初始化
父类 sam1成员初始化
父类 sam2成员初始化
父类 Test默认构造函数被调用       
                      
 -------父类普通成员初始化和构造函数运行
子类 sam1成员初始化
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用
                        -------子类普通成员初始化和构造函数运行
由此得出Java初始化顺序结论:
1 继承体系的全部静态成员初始化(先父类,后子类)
2 父类初始化完毕(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)
Java初始化顺序如图:

Java&&(面试题)初始化顺序总结的更多相关文章

  1. Java笔记 #04# 类的初始化顺序补充

    参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...

  2. Java入门记(三):初始化顺序

    初始化顺序的规则 1.在一个类的对象实例化时,成员变量首先初始化,然后才调用构造器,无论书写顺序.如果调用构造器前,没有显式初始化,那么会赋默认值. 这样做法的原因可以理解为:构造器执行时可能会用到一 ...

  3. Java中静态数据的初始化顺序

    Java的类中的数据成员中包含有静态成员(static)时,静态数据成员的初始化顺序是怎样的呢? [程序实例1] import java.util.*; import java.lang.*; imp ...

  4. java面试扫盲:对象初始化顺序(真的未必能答对)

    记录下面试里面遇到的一些java盲区,一方面扫描自己的知识盲区,一方面也可以给后面面试的朋友一些警示,以免面试的时候出现不知道的尴尬情况. 提出问题:父类静态属性,父类属性,父类构造方法,子类静态属性 ...

  5. 【基础】java类的各种成员初始化顺序

    父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序 前言: 普通代码块:在方法或语句中出现的{}就称为普通代码块.普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出 ...

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

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

  7. Java类(继承)初始化顺序

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  8. java和C#实例化类初始化顺序

    c# 初始化顺序 子类的静态字段 子类的静态构造方法 子类的实例字段 父类的静态字段 父类的静态构造方法 父类的实例字段 父类的实例构造方法 java 初始化顺序 初始化过程: 1. 初始化父类中的静 ...

  9. java中静态代码块初始化顺序

    (一)java 静态代码块 静态方法区别    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...

随机推荐

  1. SpringMVC中url映射到Controller

    SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式.前端控制器就是DispatcherServlet控制器,只要满足web.xml文件中的[url-pattern]的规 ...

  2. 洛谷 P2129 L国的战斗续之多路出击(模拟)

    P2129 L国的战斗续之多路出击 题目背景 广而告之:背景见其他L国的战斗!!大家一起刷 题目描述 这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内.但是他们都受 ...

  3. Docker For MYSQL 8.0 特别注意修复数据库新的验证方式

    从Docker登录MySQL的终端 docker exec -it wordpress-mysql /bin/bash 登录数据库 mysql -u root -p 使用MYSQL数据库 use my ...

  4. ROS-URDF-物理属性

    前言:介绍向连杆添加碰撞和惯性属性,以及向关节添加动力学. 参考自:http://wiki.ros.org/urdf/Tutorials/Adding%20Physical%20and%20Colli ...

  5. JDK介绍

    Java的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2.到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继 ...

  6. dotnet core 发布配置(测试数据库和正式数据库自动切换)

    一.起源 在进行项目开发时,常常要求开发环境,测试环境及正式环境的分离,并且不同环境运行的参数都是不一样的,比如监听地址,数据库连接信息等.当然我们把配置信息保存到一个文件中,每次发布的时候,可以先修 ...

  7. js仿新浪游戏频道导航条

    js仿新浪游戏频道导航条 在线演示本地下载

  8. 日期Date和String/Long之间的转换

    下面是关于日期的常见的几种类型转换: import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...

  9. Spring 错误日志

    13:19:14.437 [main] DEBUG org.springframework.boot.context.logging.ClasspathLoggingApplicationListen ...

  10. Android 解析XML—pull解析方式

    在Android中,常见的XML解析器分别为SAX解析器.DOM解析器和PULL解析器,其中PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部 ...