Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

标签: Java初始化顺序
3人阅读 评论(0) 收藏 举报
分类:

1、执行顺序

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

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

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

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

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

复制代码
 1 class A {
 2     public A() {
 3         System.out.println("Constructor A.");
 4     }
 5 
 6     {
 7         System.out.println("Instance Block A.");
 8     }
 9     static {
10         System.out.println("Static Block A.");
11     }
12 
13     public static void main(String[] args) {
14         new A();/*
15                  * Static Block A. Instance Block A. Constructor A.
16                  */
17     }
18 }
19 
20 class B extends A {
21     public B() {
22         System.out.println("Constructor B.");
23     }
24 
25     {
26         System.out.println("Instance Block B.");
27     }
28     static {
29         System.out.println("Static Block B.");
30     }
31 
32     public static void main(String[] args) {
33         new A();/*
34                  * Static Block A. Static Block B. Instance Block A. Constructor A.
35                  */
36         System.out.println();
37         new B();/*
38                  * Instance Block A. Constructor A. Instance Block B. Constructor B.
39                  */// 静态成员和静态初始化块只会执行一次。
40     }
41 }
复制代码

2、对变量值的影响

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

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

 

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

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

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

复制代码
 1 class Test {
 2     static {
 3         a = 3;
 4         // int b=a;//Cannot reference a field before it is defined
 5         // System.out.println(a);//Cannot reference a field before it is defined
 6         b = 3;
 7     }
 8     static int a = 1;
 9     static int b;
10 
11     public static void main(String[] args) {
12         System.out.println(a);//1
13         System.out.println(b);//3
14     }
15 }
复制代码

判断方法:

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

更多示例:

1:

复制代码
 1 class C {
 2 
 3     static {
 4         a = 2;
 5         b = 2;
 6     }
 7     static int a;
 8     static int b = 1;
 9 
10     public C() {
11         e = 3;
12     }
13 
14     {
15         c = 2;
16         d = 2;
17         e = 2;
18     }
19     int c;
20     int d = 1;
21     int e = 1;
22 
23     public static void main(String[] args) {
24         System.out.println(C.a);//2
25         System.out.println(C.b);//1
26         System.out.println(new C().c);//2
27         System.out.println(new C().d);//1
28         System.out.println(new C().e);//3
29     }
复制代码

2:

复制代码
 1 class C {
 2     public C() {
 3     }
 4 
 5     {
 6         a = 3;
 7     }
 8     static {
 9         a = 2;
10     }
11     static int a;
12     static int b;
13 
14     public static void main(String[] args) {
15         System.out.println(C.a);// 2
16         System.out.println(new C().a);// 3
17         System.out.println(C.b);// 0
18     }
19 }
复制代码

3:

复制代码
 1 class C {
 2     // 以下关于静态初始化的
 3     static {
 4         a = 2;
 5     }
 6     static int a = 1;
 7     static int b = 1;
 8     static {
 9         b = 2;
10         c = 2;
11     }
12     static int c;
13 
14     {
15         d = 2;
16     }
17     int d = 1;
18     int e = 1;
19     {
20         e = 2;
21         f = 2;
22     }
23     int f;
24 
25     public static void main(String[] args) {
26         System.out.println(C.a);// 1
27         System.out.println(C.b);// 2
28         System.out.println(new C().c);// 2
29         System.out.println(new C().d);// 1
30         System.out.println(new C().e);// 2
31         System.out.println(new C().f);// 2
32     }
33 }
复制代码

 3、总结

执行顺序:

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

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

 

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

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

1、按执行顺序

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

 


转载自:https://www.cnblogs.com/z-sm/p/6973993.html
查看评论

《C语言/C++学习指南》动态库和静态库

-
  • 1970年01月01日 08:00

Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)

1. 一个类中的初始化顺序 (静态变量、静态初始化块)=>(变量、初始化块、构造器)。 2. 两个具有继承关系类的初始化顺序 父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态...
  • u011267546
  • u011267546
  • 2014-06-07 09:04:16
  • 1382

Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)

我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:  Jav...
  • caomiao2006
  • caomiao2006
  • 2016-05-29 19:10:19
  • 1320

jAVA中静态初始化块、初始化块和构造方法的理解

在Java中,有两种初始化块:静态初始化块和非静态初始化块。它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。 非静态初始化块: 作用:给对象进行初始化。...
  • u011554611
  • u011554611
  • 2014-05-21 00:16:38
  • 2333

Java中初始化块和静态初始化块的区别

http://www.cnblogs.com/woshijpf/articles/3632489.html 在Java中,有两种初始化块:静态初始化块和非静态初始化块. 静态初始化块:...
  • hotdust
  • hotdust
  • 2016-06-29 09:39:39
  • 957

java中静态初始化块,实例初始化块,构造函数区别

public class People { public static int num=0;//静态变量 String name; static//静态初始化块 { ...
  • yilip
  • yilip
  • 2014-12-17 20:51:57
  • 5249

关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

  • 2013年09月23日 16:41
  • 7KB
  • 下载

变量、初始化块和构造方法的初始化顺序问题(笔试题)

给出如下程序,让写出程序打印的语句的顺序,也就是程序加载执行的过程。 package com.skd.timu; public class Demo4 { public static void m...
  • u010113156
  • u010113156
  • 2015-03-19 00:10:45
  • 613

java 中类初始化,构造方法,静态成员变量,静态块的加载顺序

1、编译和运行概念要搞清:编译即javac的过程,负责将.java文件compile成.class文件,主要是类型、格式检查与编译成字节码文件,而加载是指java *的过程,将.class文件加载到内...
  • a1028253086
  • a1028253086
  • 2017-03-02 22:34:46
  • 2460

JAVA学习笔记(九)- 初始化块与静态代码块

初始化块/* * 初始化块 * 初始化变量方式:声明时、构造函数、代码块 * 使用static关键字修饰的代码块,称为静态代码块 * * 执行顺序:静态代码块>代码块>构造方法 * ...
  • wangzi11322
  • wangzi11322
  • 2015-03-23 10:22:06
  • 3751
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1130
    排名: 4万+