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]定义多个前缀映射的问题

    转自:https://penciltim.iteye.com/blog/501073 我在web.xml里面定义多个dispatch-servlet的前缀映射,像下面这样 <!-- Servle ...

  2. 网上订餐系统的SQL SERVER 2005数据库连接

  3. php循环跳出

    PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式: 代码: <?php $i = 1 ...

  4. 努比亚(nubia) V18 NX612J 解锁BootLoader 并刷入recovery ROOT

    recovery制作来自绯色玻璃 努比亚(nubia) V18 NX612J 解锁BootLoader 并刷入recovery ROOT 工具下载链接:https://pan.baidu.com/s/ ...

  5. 课上练习 script

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. dubbo之分组聚合

    按组合并返回结果 ,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项. 相关代码可以参考 dubbo 项目 ...

  7. 使用OpenCV画折线图

    使用OpenCV画直方图是一件轻松的事情,画折线图就没有那么Easy了,还是使用一个库吧: GraphUtils 源代码添加入工程 原文链接:http://www.360doc.com/content ...

  8. C# 前一个数是后一个数的父级

    private void button2_Click(object sender, EventArgs e) { var str = "1 2 3 4 5 6 7 8 9 10 11 12 ...

  9. 怎样批量删除PDF文件中的注释

    日常我们在阅读一些PDF文章时候,我们会发现有些PDF文章带有非常多的注释,显得非常不美观,影响了阅读体验.那么PDF文章里的批注应该怎么进行删除呢?怎样批量删除PDF文件中的注释?   操作教程: ...

  10. python tips:小整数对象池与字符串intern

    本文为is同一性运算符的详细解释.is用于判断两个对象是否为同一个对象,具体来说是两个对象在内存中的位置是否相同. python为了提高效率,节省内存,在实现上大量使用了缓冲池技术和字符串intern ...