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. [100]linux常用命令参数小结

    1.mkdir 2.ls -l -d 显示目录 -F 给文件夹结尾加/标识 -a 以.开头的都是隐藏文件 -rt 按照修改时间倒序排列(最新修改的在最下) ls -lhrt #最新的在下面 3.cd ...

  2. BLIST,BindingSource

    //gridControl1.DataSource = BList; //BindingSource bs = new BindingSource(); //bs.DataSource = BList ...

  3. centos chroot使用

    chroot命令用来在指定的根目录下运行指令.chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以/,即是以根 (r ...

  4. 菜鸟学SSH(十六)——Struts2内部是如何工作的

    前面说完了Spring.Hibernate,很自然今天轮到struts了.struts的核心原理就是通过拦截器来处理客户端的请求,经过拦截器一系列的处理后,再交给Action.下面先看看struts官 ...

  5. nodejs中的框架介绍

    Sequelize 关系型数据库对象模型映射框架 mongoose 非关系型数据库文档模型映射框架

  6. Checkbox: ListView 与CheckBox 触发事件冲突的问题

    我相信很多人都遇到过 ListView 中放入checkBox ,会导致ListView的OnItemClickListener无效,这是怎么回事呢? 这是因为checkBox 的点击事件的优先级比L ...

  7. burpsuite扩展集成sqlmap插件

    通常我们在使用sqlmap测试SQL注入问题的时候会先使用burpsuite来抓包,然后交给sqlmap进行扫描,此操作略显繁琐. 为了避免这种繁琐的重复操作可以将sqlmap以插件的方式集成到bur ...

  8. golang将interface{}转换为struct

    项目中需要用到golang的队列,container/list,需要放入的元素是struct,但是因为golang中list的设计,从list中取出时的类型为interface{},所以需要想办法把i ...

  9. $.ajax使用总结(一):Form提交与Payload提交

    http://blog.csdn.net/yiifaa/article/details/73468001 *********************************************** ...

  10. JS实现文本框和文本域获取焦点focus()时,光标在本文的末尾

    <!-- <input type="text" id="test1" name="test1" value="test ...