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. Cash Machine(多重背包)

    http://poj.org/problem?id=1276 #include <stdio.h> #include <string.h> ; #define Max(a,b) ...

  2. 网络简要<入门篇>对应配置代码

    交换机的配置 (1)交换机的模式: switch>    用户模式,可以查看设备的部分内容 SW-3ceng>enable SW-3ceng#          进入特权模式,可以查看更多 ...

  3. .Net Core学习(一)

    1.安装.Net Core https://www.microsoft.com/net/core#windows 2.创建一个.Net Core项目,win+R调出控制台,输入下面命令 mkdir a ...

  4. WPF播放器

    最近由于工作需要,需要做一个播放软件,在网上参考了很多例子,园子里有很多代码.其中最多的就是wpf自带的MediaElement控件,或者VLC视频播放器. 先附我自己查询资料的链接: MediaEm ...

  5. hibernate_06_单表操作_组件属性

    什么是组件属性? 比如address是students的其中一个属性,而address又有三个属性:邮编.电话和地址.address就是hibernate的组件属性. 首先建立Address类: pa ...

  6. 使用NDK编译VTK

    VTK提供了对安卓的CMAKE编译支持,其介绍文件在源代码根目录下的 "/cmake/android.toolchain.cmake". 对Wndows的编译自持描述为: 注意:但 ...

  7. 我的web前端自学之路-心得篇:我为什么要学习web前端?

    时光如流水,转眼间,自己已经是大三的学长了,看着一个个学弟学妹,心中有种莫名的感觉,很怀念大学的前两年时光,但也很憧憬着自己的未来,自己将要去经历很多从未经历的事.我是我们学校信科院的一名学生,在编程 ...

  8. ApplicationLoader登录失败

    报错:Please sign in with an app-specific password. You can create one at appleid.apple.com 是因为帐号开启了双重认 ...

  9. java操作Excel的poi的字体设置

    package com.java.poi; import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.use ...

  10. 国密SSL证书申请免费试用

    沃通提供国密SSL证书免费申请试用服务,一次申请可同时签发SM2/RSA双算法证书,试用周期1个月,用于测试国密SM2 SSL证书的运行效果和SM2/RSA双证书部署效果. 试用产品:SM2/RSA双 ...