当前位置:首页 > 开发 > 编程语言 > Java > 正文

一道经典的JAVA面试题

发表于: 2013-09-18   作者:buyi_   来源:转载   浏览次数:
摘要: 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); } } clas
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 = 1
b = 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 = 1
b = 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、对各个静态变量按顺序显示初始化(即按照代码里面的初始化为其初始化)。

一道经典的JAVA面试题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向
//20、String 和StringBuffer的区别 String: (1)String 类代表字符串。 Java 程序中的所有字符串
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个
第一部分:用CSS实现布局 请使用CSS控制3个div,实现如下图的布局: <div class="rightcontainer
题目: 有一个N*N的矩阵,矩阵内的数字都是整数,包括正数、负数和0。起点是左上角,目的地是右下角
今天笔者几篇文章介绍了改雇员查询的文章. 关联文章的地址 以下各个标题将用到上图的4个表,其关联
一、用CSS实现以下布局 让我们一起来做一个页面 首先,我们需要一个布局。 请使用CSS控制3个div,实
就这道题我也想些想法,当时他们和我说完,我在想用什么方法可以实现。毕竟现在javaSE都忘的差不多
前天在群里看到一道面试题,一下子有点蒙... 第一反应当然是选A,先不说没引用头文件和声明使用命名
记得不久以前有道面试题,要求下面的数据结构 里面每一项都是一个id和一个name,并且,要求能够通过
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号