首先什么话都不说,先把这个很变态的面试题放上来,大家有情趣自己分析一下,然后再运行一下看看结果,据说第
一次遇到这个题目的Java程序员都是会做错的。
package com.bird.classLoad;
public class Test1 {
@SuppressWarnings("static-access")
public static void main(String[] args) {
Singleton s = Singleton.getSingleton();
System.out.println("counter1 = "+ s.counter1);
System.out.println("counter2 = "+s.counter2);
}
}
class Singleton{
private static Singleton singleton = new Singleton();
public static int counter1;
public static int counter2 = 0;
public Singleton(){
counter1++;
counter2++;
}
public static Singleton getSingleton(){
return singleton;
}
}
如果你没有分析出来结果是1,0那么请您继续往下看。
首先介绍一下JVM对一个类的字节码class文件是如果装载到内存中然后被虚拟机执行的。
1.加载:查找并加载类的二进制数据
2.连接
2.1:确保被加载类的正确性
2.2:为类的静态变量分配内存,并将其初始化为默认值
2.3:把类中的符号引用转换为直接引用
3.初始化:为类的静态变量赋予正确的初始值
请注意,在连接的时候,为类的静态变量分配内存,初始化为默认值,然后才把类中的符号转换为指定的引用。
当然了,JVM只有在主动调用类的时候才回去加载一个类,主动调用一共有六种方式
Java虚拟机主动使用一个类的六种情况
1.创建类的实例
2.访问某个类或接口的静态变量,或者对该静态变量赋值
3.调用类的静态方法
4.反射
5.初始化一个类的子类
6.Java虚拟机启动时被标明为启动类的类
除了以上六种情况,其他都为被动使用,都不会执行类的初始化
然后对于类加载器
有两种类型的类加载器
1.根类加载器(使用C++编写,程序员无法在Java代码中获得该类)
2.扩展类加载器
3.系统类加载器
用户自定义类加载器
ClassLoader的子类
比如
package com.bird.classLoad;
public class Test2 {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("java.lang.String");
System.out.println(clazz.getClassLoader());
Class clazz2 = Class.forName("com.bird.classLoad.A");
System.out.println(clazz2.getClassLoader());
}
}
class A{}
运行结果
null
sun.misc.Launcher$AppClassLoader@addbf1
说明String类是JDK自带的,是使用默认根加载器加载的,它是使用C++编写的,所以才会返回null,SUN不允许直接
访问这个根加载器的。
然后对于自己写的类,当然是通过内部类application加载器加载的,虽然都能使用,但是底层加载方式各不相同。
最后我们来分析程序
首先执行Singleton s = Singleton.getSingleton();
主动调用 Singleton,这之后初始化Singleton类,为static变量初始化内存空间然后赋予默认值。所以,singleton为
null,counter1为0,counter2为0.
然后赋予引用值。singleton调用构造函数,这时候counter1等于1,counter2等于1.
然后顺次执行,counter1没有被赋值,counter2被赋值为0.
这次就返回这个对象了,所以最终结果为,1,0
总结一下,这道题真坑爹。
分享到:
相关推荐
【Java面试题】类加载器
JAVA笔试题,面试题JAVA笔试题,面试题JAVA笔试题,面试题JAVA笔试题,面试题JAVA笔试题,面试题
java笔试题面试题java笔试题面试题java笔试题面试题java笔试题面试题java笔试题面试题java笔试题面试题
1、java笔试题大集合 2、各个公司面试题 3、J2EE初学者面试题 4、J2EE面试题(打码查错题) 5、java_华为笔试题 6、java常见面试题 7、java程序员面试宝典 8、java面试题及答案 9、java面试题编程篇 10、Oracle面试...
大唐电信JAVA笔试题面试题 27 西安电讯盈科java笔试题 27 华为Java笔试题: 28 Java多线程常见面试题 31 Java企业面试题整理集合(1) 34 Java企业面试题整理集合(2) 43 Java企业面试题整理集合(3) 55 Java企业面试题...
java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 java笔试题 ...
JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题
文思 笔试题 Java 面试题 文思 笔试题 Java 面试题
java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题java面试题...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
JAVA面试题和笔试题总汇(含答案)
JAVA面试笔试题大全JAVA面试笔试题大全JAVA面试笔试题大全JAVA面试笔试题大全JAVA面试笔试题大全
JAVA面试笔试题大汇总JAVA面试笔试题大汇总JAVA面试笔试题大汇总JAVA面试笔试题大汇总JAVA面试笔试题大汇总JAVA面试笔试题大汇总JAVA面试笔试题大汇总,JAVA面试笔试题大汇总JAVA面试笔试题大汇总
Java面试题以及答案整理
Java面试题笔试题大全:Java面试题笔试题大全.chm
java试题 java笔试题 java面试题java试题 java笔试题 java面试题
java面试笔试资料java笔试题大集合及答案题库java笔试题汇总资料188个合集 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx ...
java面试资料java面试题集java笔试题汇总资料,java面试资料java面试题集java笔试题汇总资料,java面试资料java面试题集java笔试题汇总资料,包括基础面试题、JavaWeb面试题、JAVA面试题集.txt、分布式相关面试题...
java面试笔试题库java软件设计java笔试题大集合及答案文档资料合集300MB“ 100家大公司java笔试题汇总.doc 125条常见的java 面试笔试题大汇总.pdf 2011最新整理java经典代码.doc 25个经典的Spring面试问答.docx 8张...
java工程师面试题大全-100%公司笔试题你都能碰到几个