java 初始化顺序
java 变量类型如下:
实例变量;
类变量;
初始化途经如下:
实例变量
--声明时,初始化;
--非静态初始化块内,初始化;
--构造函数内,初始化;
实例1:
public class bean1 { int d;
int e;
int c;
int b;
int f; {
c = 3;
}
int a = 1; {
b = 2;
} public bean1() { d = 4;
f = 5;
e = 6;
} public int geta() { return a; } }
javap -c bean1.class 查看反汇编代码如下:
Compiled from "bean1.java"
public class initialization.bean1 {
int d; int e; int c; int b; int f; int a; public initialization.bean1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_3 //初始化c
6: putfield #2 // Field c:I
9: aload_0
10: iconst_1 //初始化a
11: putfield #3 // Field a:I
14: aload_0
15: iconst_2 //初始化b
16: putfield #4 // Field b:I
19: aload_0
20: iconst_4 //初始化d
21: putfield #5 // Field d:I
24: aload_0
25: iconst_5
26: putfield #6 // Field f:I
29: aload_0
30: bipush 6
32: putfield #7 // Field e:I
35: return public int geta();
Code:
0: aload_0
1: getfield #3 // Field a:I
4: ireturn
}
结论:实例变量的初始化均在public initialization.bean1()当中完成,无论是在声明时直接初始化,还是在代码块当中初始化,本质均在构造函数里面进行初始化,在构造函数当中的初始化顺序取决于在 定义直接初始化和代码块初始化中的顺序。
类变量
--声明时,初始化;
--静态初始化块内,初始化;
实例2:
package initialization; public class bean2 { static int d;
static int e = 5;
static int c;
int b;
int f;
int a = 1;
static {
c = 3;
System.out.println("hello,static"); } {
b = 2;
System.out.println("hello");
}
static {
d = 4; } public bean2() { f = 6;
} public int geta() { return a; } }
新建bean2实例时,输出如下:
hello,static
hello
静态代码块是主动执行的,需要在项目启动的时候就初始化;
javap -c bean2.class 查看反汇编代码如下:
Compiled from "bean2.java"
public class initialization.bean2 {
static int d; static int e; static int c; int b; int f; int a; public initialization.bean2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1 //初始化a
6: putfield #2 // Field a:I
9: aload_0
10: iconst_2 //初始化b
11: putfield #3 // Field b:I
14: aload_0
15: bipush 6
17: putfield #4 // Field f:I
20: return public int geta();
Code:
0: aload_0
1: getfield #2 // Field a:I
4: ireturn static {};
Code:
0: iconst_5 //初始化e
1: putstatic #5 // Field e:I
4: iconst_3 //初始化c
5: putstatic #6 // Field c:I
8: iconst_4 //初始化d
9: putstatic #7 // Field d:I
12: return
}
结论: 实例变量的初始化均在public initialization.bean2()当中完成,无论是在声明时直接初始化,还是在代码块当中初始化,本质均在构造函数里面进行初始化,在构造函数当中的初始化顺序取决于在 定义直接初始化和代码块初始化中的顺序;
类变量在static {}中完成,且初始顺序以代码中顺序为主,类变量在实例变量前执行;
关于java final可以查看:http://www.cnblogs.com/dolphin0520/p/3736238.html
java 初始化顺序的更多相关文章
- Java初始化顺序
package com.helei.init; class Log { public static String fatherStaticString(){System.out.println(&qu ...
- [转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包 ...
- C# 与Java初始化顺序及异同(转)
C#初始化顺序 类成员变量初始化先于类的构造函数 静态成员变量先于实例变量 子类成员变量先于父类成员变量(java相反) 父类构造函数先于子类构造函数 参考实例: using System; //us ...
- java 初始化顺序问题
今天在<thinking in java>上面看了关于初始化问题,之前从来都没有深入考虑过,这次算是把它搞明白了,所以记录一下: 这个不是我看到的初始化顺序问题,在网上搜索的时候发现的,感 ...
- Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)
1.执行顺序 1.1.一个类中的初始化顺序 类内容(静态变量.静态初始化块) => 实例内容(变量.初始化块.构造器) 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)= ...
- 10、java初始化顺序
在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变 ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- Java 类成员的初始化顺序
Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. 1 无继承情况下的Jav ...
- Android(java)学习笔记136:Java类初始化顺序
Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化( ...
随机推荐
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- [No00008A]bat改变cmd命令提示符颜色
从Windows 95到现在的Windows 10,系统中带的DOS命令提示符软件都是黑白画面,下面教大家几个自定义DOS命令提示符颜色的小技巧. 改变DOS命令提示符的标题:在开始菜单点运行,输入 ...
- HTML 学习笔记 JQuery(选择器)
学习前端也有一段时间了,今天终于进入到JQuery阶段了,对于新手来讲,JQuery的选择器类型之多 功能之强大实在不是一天两天能够记得完的.现在,就采用边学边记录的方式.以后要是忘了的话,也有一个地 ...
- Keepalived使用梳理
keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...
- 配置VSCode右键菜单
修改注册表,添加鼠标右键 选择文件 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\VSCode]@="Ope ...
- SQL基础语法(五)
SQL INSERT INTO 语句INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法:INSERT INTO 表名称 VALUES (值1, 值2,....) ...
- C++ namespace
namespace, 命名空间, 用于解决命名冲突的问题. Python中的package/module, Javascript中的object, Java中的package都具有这样的功能. 如何使 ...
- hdu3714 三分找最值
Error Curves Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- Javascript数值转换(string,int,json)
数值: 在JavaScript中,数值转换一般有三种方式: 一.Number(param)函数:param可以用于任何数据类型 1.1 param是Boolean值,true和false分别转换为1和 ...
- Bzoj2957 楼房重建
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1516 Solved: 723[Submit][Status][Discuss] Descripti ...