1、执行顺序

1.1、一个类中的初始化顺序

类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)

1.2、两个具有继承关系类的初始化顺序

父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)

示例如下:(结果见注释)

 class A {
public A() {
System.out.println("Constructor A.");
} {
System.out.println("Instance Block A.");
}
static {
System.out.println("Static Block A.");
} public static void main(String[] args) {
new A();/*
* Static Block A. Instance Block A. Constructor A.
*/
}
} class B extends A {
public B() {
System.out.println("Constructor B.");
} {
System.out.println("Instance Block B.");
}
static {
System.out.println("Static Block B.");
} public static void main(String[] args) {
new A();/*
* Static Block A. Static Block B. Instance Block A. Constructor A.
*/
System.out.println();
new B();/*
* Instance Block A. Constructor A. Instance Block B. Constructor B.
*/// 静态成员和静态初始化块只会执行一次。
}
}

2、对变量值的影响

一个变量,若显示初始化、初始化块对该变量赋值、构造方法对该变量赋值同时存在,则变量最终值如何确定?按1节中所述的执行顺序确定。

这里考虑初始化块在变量定义之前的情形,此时会造成迷惑。

初始化块可以对在它之后定义的变量赋值,但不能访问(如打印)。如:

     static {
a = 3;
// int b=a;//Cannot reference a field before it is defined
// System.out.println(a);//Cannot reference a field before it is defined
}
static int a = 1;

“对变量值的影响”是指 对变量赋值的初始化块位于变量定义之前 时,变量的最终值根据变量定义时是否显示初始化而会有不同结果(若初始化块位于变量定义之后,那么变量的值显然很容易就确定了,不会造成迷惑)。如:

 class Test {
static {
a = 3;
// int b=a;//Cannot reference a field before it is defined
// System.out.println(a);//Cannot reference a field before it is defined
b = 3;
}
static int a = 1;
static int b; public static void main(String[] args) {
System.out.println(a);//
System.out.println(b);//
}
}

判断方法:

显示初始化内部隐含 定义变量和对变量进行赋值的初始化块两部分,所以初始化块和显示初始化哪个在后变量的最终值就是该值。

更多示例:

1:

 class C {

     static {
a = 2;
b = 2;
}
static int a;
static int b = 1; public C() {
e = 3;
} {
c = 2;
d = 2;
e = 2;
}
int c;
int d = 1;
int e = 1; public static void main(String[] args) {
System.out.println(C.a);//2
System.out.println(C.b);//1
System.out.println(new C().c);//2
System.out.println(new C().d);//1
System.out.println(new C().e);//3
}

2:

 class C {
public C() {
} {
a = 3;
}
static {
a = 2;
}
static int a;
static int b; public static void main(String[] args) {
System.out.println(C.a);//
System.out.println(new C().a);//
System.out.println(C.b);//
}
}

3:

 class C {
// 以下关于静态初始化的
static {
a = 2;
}
static int a = 1;
static int b = 1;
static {
b = 2;
c = 2;
}
static int c; {
d = 2;
}
int d = 1;
int e = 1;
{
e = 2;
f = 2;
}
int f; public static void main(String[] args) {
System.out.println(C.a);//
System.out.println(C.b);//
System.out.println(new C().c);//
System.out.println(new C().d);//
System.out.println(new C().e);//
System.out.println(new C().f);//
}
}

3、总结

执行顺序:

1、类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)

2、父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)

初始化块可以对在它之后定义的变量赋值,但不能访问(如打印)。

变量最终值:一个变量,若显示初始化、初始化块对该变量赋值、构造方法对该变量赋值同时存在,则变量最终值如何确定:

1、按执行顺序

2、若对变量赋值的初始化块在变量定义前时:若变量显示初始化了则最终为显示初始化值,否则为初始化块的赋值。

:凡事总有例外,实例初始化也可能位于类静态初始化前,示例:

public class StaticTest {

    public static void main(String[] args) {
staticFunction();
} static StaticTest st = new StaticTest(); static {
System.out.println("1");
} {
System.out.println("2");
} StaticTest() {
System.out.println("3");
System.out.println("a=" + a + ",b=" + b);
} public static void staticFunction() {
System.out.println("4");
} int a = 110;
static int b = 112;
} 结果如下:
2
3
a=110,b=0
1
4

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)的更多相关文章

  1. java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

    一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构

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

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

  3. Java 类成员的初始化顺序

    Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究.   1  无继承情况下的Jav ...

  4. Android(java)学习笔记136:Java类初始化顺序

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

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

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

  6. Java类初始化顺序,大神3个示例带你躺坑。。

    最近发现微信群里面有些群友在讨论类的初始化顺序,如类的静态变量.成员变量.静态代码块.非静态代码块.构造器,及继承父类时,它们的初始化顺序都是怎样的,下面我通过例子来说明这个情况,以免被人误导. 示例 ...

  7. Spring boot变量的初始化顺序

    起因是Spring建议”总是在您的bean中使用构造函数建立依赖注入.总是使用断言强制依赖”,而且之前用@Autowired时idea总是给警告,于是全部改成了构造器注入,运行时发生了循环注入,于是找 ...

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

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

  9. Java对象的初始化顺序

    new一个对象时,该对象的初始化顺序如下 : 父类中的静态成员变量 父类中的静态代码块 子类中的静态成员变量 子类中的静态代码块 父类中的非静态变量 父类中的非静态代码块 父类构造函数 子类中的非静态 ...

  10. Java&&(面试题)初始化顺序总结

    1  无继承情况下的Java初始化顺序: class Sample {       Sample(String s)       {             System.out.println(s) ...

随机推荐

  1. Vue(五):Vue模板语法

    1.{{...}}(双大括号) 文本插值 <div id="app"> <p>{{ message }}</p> </div> 2. ...

  2. 期盼已久的spring-net居然有新版本2.0.1-GA

    https://github.com/spring-projects/spring-net/tree/spring-net-2.0.1-GA https://www.nuget.org/package ...

  3. python常用运维脚本实例

    转载  file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建.但是更推荐使用内置函数open()来打开一个文件 ...

  4. Webservice超时问题

    Winform客户端调用Webservice 120秒超时.对此问题,针对服务器与客户端分别作了超时设置为300S. 1. 服务器端设置超时 在 web.config 的 system.web 里添加 ...

  5. Unix/Linux系统中僵尸进程是如何产生的?有什么危害?如何避免?

    如题 Unix/Linux系统中僵尸进程是如何产生的?有什么危害?如何避免? 一个进程在调用exit命令结束自己的生命的时候,其实他并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结 ...

  6. [Windows Azure] How to Deploy a Database to Windows Azure

    How to Deploy a Database to Windows Azure There are several different ways you can move an on-premis ...

  7. 找个些有用的网站(CSS生成)

    http://www.shejidaren.com/css-button-generator-and-beautifucl-style-sheet.html

  8. Silverlight 控件

    http://www.cnblogs.com/yangfan/archive/2010/03/11/1683580.html

  9. Asp.Net MVC简单三层架构(MVC5+EF6)

    三层架构与MVC的关系 三层架构是一个分层式的软件体系架构设计,分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).分层的目的是为了实现“高内聚,低耦合”的思想,有利于系统后期的维护.更 ...

  10. java向mysql插入数据乱码

    修改jdbc的链接,将原来的         jdbc:mysql://localhost:3306/demo改为        jdbc:mysql://localhost:3306/demo?us ...