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 .继承体系的所有静态成员初始化( ...
随机推荐
- stm32 usb error : identifier "bool" is undefined
.\usb\USB\usb_pwr.h(54): error: #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): ...
- Juniper SSG5 PPTP VPN 619错误解决
公司分部的客户端需要使用PPTP VPN连接总部,将网关更换为Juniper SSG5后,客户端出现了每几个小时自动断开的现象,错误619. 解决:Security —— ALG —— 开启PPTP协 ...
- 算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。
只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/588 ...
- L1-006. 连续因子
https://www.patest.cn/contests/gplt/L1-006 题目地址 在上面 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就 ...
- 嵌入式Linux驱动学习之路(二十四)Nor Flash驱动程序
Nor Flash和Nand Flash的不同: 类型 NOR Flash Nand Flash 接口 RAM-like,引脚多 引脚少 容量 小(1M.2M...) 大(512M.1G) 读 简 ...
- 解读ASP.NET 5 & MVC6系列(13):TagHelper
在新版的MVC6中,微软提供了强大的TagHelper功能,以便让我们摆脱如下的臃肿代码: @Html.LabelFor(model => model.FullName) @Html.EditF ...
- [LeetCode] Factorial Trailing Zeroes 求阶乘末尾零的个数
Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...
- WIN10下安装HBASE教程
工作需要,现在开始做大数据开发了,通过下面的配置步骤,你可以在win10系统中,部署出一套hadoop+hbase,便于单机测试调试开发. 准备资料: 1. hadoop-2.7.2: https:/ ...
- 使用Minicom基于串口调试HiKey
虽然通过adb shell调试方便,但是有些时候不得不借助于串口进行调试,比如测试suspend to ram之类的功能时,adb服务被关闭. 同时在minicom中也可以进入shell,进行操作. ...
- DDR相关的低功耗技术之PASR、TCSR、DPD
随着智能机的发展,DDR内存容量越来越大,bank数量越来越多,功耗也越来越大.在不需要的时候关闭部分bank,或者降低自刷新频率,或者进入深度低功耗模式.有三种DDR技术用来降低功耗: PASR(P ...