文档章节

Java初始化顺序

thelastday
 thelastday
发布于 2016/11/17 23:02
字数 706
阅读 9
收藏 0

Java 变量类型

  1. 实例变量;
  2. 类变量;

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可以查看:java final ;

© 著作权归作者所有

共有 人打赏支持
上一篇: jackson笔记
thelastday
粉丝 2
博文 9
码字总数 4696
作品 0
渝中
私信 提问

暂无文章

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
32分钟前
2
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
44分钟前
3
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
46分钟前
9
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
47分钟前
2
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
52分钟前
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部