一道经典的JAVA面试题
编程技术  /  houtizong 发布于 3年前   69
public class M {public static void main(String[] args) {N n = N.getInstence();System.out.println("a = " + n.a);System.out.println("b = " + n.b);}}class N {public static int a;public static int b = 0;private static N n = new N();private N() {a++;b++;}public static N getInstence() {return n;}}
上面的代码普遍都能知道答案,输出是:
a = 1b = 1
如果把上面的N类里面的创建N的成员对象的时候调换位置,代码如下:
public class M {public static void main(String[] args) {N n = N.getInstence();System.out.println("a = " + n.a);System.out.println("b = " + n.b);}}class N {private static N n = new N();public static int a;public static int b = 0;private N() {a++;b++;}public static N getInstence() {return n;}}
现在输出的确不在是上面的结果,结果如下:
a = 1b = 0
我们都知道类加载的时候首先加载的是静态代码,在第一个代码里面,当执行 N n = N.getInstence();的时候,java虚拟机会去加载N类,在加载N类的时候,按照顺序:
public static int a;public static int b = 0;private static N n = new N();
首先给静态变量分配内存空间,其次给静态变量赋予默认值然得到 a = 0;b = 0;n = null;然后显示初始化各静态变量,因为a没有显示赋初值,所以a = 0,而b显示赋初值为0,所以b = ,然后显示为n赋初值,在new N()的时候对a、b自增,得到 a = 1;b = 1;所以最终结果如上述。
在第二段代码里面,当执行 N n = N.getInstence();的时候,java虚拟机会去加载N类,在加载N类的时候,按照顺序:
private static N n = new N();public static int a;public static int b = 0;
首先给静态变量分配内存空间,其次给静态变量赋予默认值,得到 n = null ;a = 0; b = 0;
然后显示初始化各静态变量,n为N对象,在new N()的时候对a、b自增,得到a = 1;b = 1;
因为a没有显示赋予初值,所以a还是为a = 1;而b显示赋予初值为0,所以b = 0;得到最终结果如上述。
所以得到最终的结论是,jvm在加载类的时候对静态代码按如下步骤处理:
1、当jvm在加载类的时候,首先是对各个静态变量分配空间。
2、对各个静态变量赋予默认值(比如int、long型的默认值为0,Object的默认值为null)。
3、对各个静态变量按顺序显示初始化(即按照代码里面的初始化为其初始化)。
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接