jvm 静态类及非静态类的变量,方法加载顺序
来源:互联网 发布:sql server 分组排序 编辑:程序博客网 时间:2024/06/04 19:35
2 class data{
3 private static final data mInstance = new data();
4 private static int mx = 0;
5 private data()
6 {
7 System.out.println("mx=" + mx);
8 mx = getVersion();
9 }
10 public static data getInstance()
11 {
12 return mInstance;
13 }
14 public int getVersion()
15 {
16 int v = 0;
17 if (v == 0)
18 {
19 v = 7;
20 }
21 return v;
22 }
23 public int getmx()
24 {
25 return mx;
26 }
27 }
28
29 class Test
30 {
31 public static void getData(StringBuffer sb)
32 {
33 sb.append("hello world ");
34 }
35 public static void main(String args[])
36 {
37 System.out.println(data.getInstance().getmx());
38 }
39 } 打印结果:
mx=0
3 private static final data mInstance = new data();
4 private static int mx = 0;
5 private data()
6 {
7 System.out.println("mx=" + mx);
8 mx = getVersion();
9 }
10 public static data getInstance()
11 {
12 return mInstance;
13 }
14 public int getVersion()
15 {
16 int v = 0;
17 if (v == 0)
18 {
19 v = 7;
20 }
21 return v;
22 }
23 public int getmx()
24 {
25 return mx;
26 }
27 }
28
29 class Test
30 {
31 public static void getData(StringBuffer sb)
32 {
33 sb.append("hello world ");
34 }
35 public static void main(String args[])
36 {
37 System.out.println(data.getInstance().getmx());
38 }
39 } 打印结果:
mx=0
0
其实这个问题很简单,牵扯到类加载顺序以及类中代码执行的顺序问题。
类的初始化顺序如下:
父类静态变量
父类静态块
子类静态变量
子类静态块
父类变量
父类普通块
父类构造函数(子类实例化时先要调用父类构造函数)
子类变量
子类普通块
子类构造函数
如果有多个初始化块,则按照代码先后顺序执行。
因此此问题解释如下:
1.date中的静态变量data会在类加载的时候首先初始化,因此初始化的时候调用date构造函数,将会将m赋值为7,
2.然后执行private static int mx = 0进行初始化m操作,因此此时m又成了0.
楼主可以将private static int mx = 0这句放在private static final data mInstance = new data();前面执行,结果就会不一样了。
可以在private static final data mInstance = new data();
后面加上
static{
System.out.println("static");
}
然后执行看看初始化的先后顺序如何
阅读全文
0 0
- jvm 静态类及非静态类的变量,方法加载顺序
- 静态与非静态块和变量的加载顺序
- java 中类初始化,构造方法,静态成员变量,静态块的加载顺序
- java 继承时子类父类的静态非静态成员变量,构造方法,静态代码块的初始化顺序
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
- 静态变量、静态方法、静态代码块、非静态变量及非静态方法的简单介绍
- 静态类,静态方法,静态变量与非静态之前的区别
- 静态类,静态方法,静态变量与非静态之前的区别
- 静态类,静态方法,静态变量与非静态之前的区别
- 静态类,静态方法,静态变量与非静态之间的区别
- 静态加载顺序,类static变量也有默认值(不同于C++),普通成员变量直接赋值语句和非静态语句块的执行位置
- 静态类、静态方法、静态代码块及初始化顺序
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造方法)
- 不包含继承时类中的静态块、静态方法、非静态方法、构造函数的执行顺序?
- 类加载器--java静态方法静态变量
- 阿里面试题:关于类中静态,非静态,构造方法的执行顺序
- 关于类中静态,非静态,构造方法的执行顺序
- H.264(H264)解码SPS获取分辨率和帧率
- POJ1251_简单的Prim的应用,使用的是优先队列prim
- Android APP测试流程
- 什么是 solr
- 按照带不带返回值来划分方法
- jvm 静态类及非静态类的变量,方法加载顺序
- 插值算法分类
- 【持续更新】笔记整理-20170714-Kubernetes 入门
- API接口测试用例设计
- SSH框架中Hibernate实现对数据的持久化
- How to install caffe in macOS 10.12.5
- AngularJS第五课(模块,动画,依赖注入)
- primeng使用步骤
- Fluent interface 简介