java 关于类加载的一道面试题

 这道面试题,知识点是,java在加载类的时候,有一个准备阶段,准备阶段会给类的静态成员变量赋java默认的初始值。

再走到类的初始化阶段,才会给类的静态成员变量赋程序员给的值。

package nine4one;

/**
 * java虚拟机将在以下四种情况结束生命周期
 * 1.执行了System.exit();方法,0是正常退出
 * 2.程序执行正常结束
 * 3.程序在执行过程中遇到了异常或者错误而异常终止
 * 4.由于操作系统出现错误而导致java虚拟机进程终止
 * -------------------------
 * 类的加载、连接与初始化
 * 1.加载:查找并加载类的二进制数据
 * 2.连接:
 *  -验证:确保被加载的类的正确性;
 *  -准备:为类的静态变量分配内存,并将其初始化为默认值
 *  -解析:把类中的符号引用转换为直接引用
 * 3.初始化:为类的静态变量赋予正确的初始值
 * 
 * --------------------------
 * java程序对类的使用方式可分为两种:
 * 1.主动使用
 *  -创建类的实例
 *  -访问某个类或接口的静态变量, 或者对该静态变量赋值
 *  -调用类的静态方法
 *  -反射,如:Class.forName("");
 *  -初始化一个类的子类
 *  -java虚拟机启动时被标明为启动类的类
 * 2.被动使用
 * 所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时,才初始化它们。
 * 
 * ----------------------------
 * 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在
 * 堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
 * 
 * ---------------------------
 * 加载class文件的方式
 * -从本地系统中直接加载v
 * -通过网络下载.class文件
 * -从zip,jar等归档文件中加载.class文件
 * -从专有数据库中提取.class文件
 * -将java源文件动态编译为.class文件
 * 
 * ----------------------------
 * 类的加载的最终产品是位于堆区中的Class对象
 * Class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口
 * 
 * ----------------------------
 * 有两种类型的类加载器
 * -java虚拟机自带的加载器
 * 		根类加载器(Bootstrap),c++实现
 * 		扩展类加载器(Extension),java实现
 * 		系统类加载器(System)又称应用加载器,java实现
 * -用户自定义类加载器
 * 		java.lang.ClassLoader的子类
 * 		用户可以定制类的加载方式 
 * 类加载器并不需要等到某个类被“首次主动使用”时再加载它
 * ----------------------------------------
 * jvm规范允许类加载器在预料某个类将要被使用时就预先加载它,如果
 * 在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在
 * 程序首次主动使用该类时才报告错误,(LinkageError错误)
 * 
 * 如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
 * 
 * 类的验证:
 * 	-类文件的结构检查     
 * 	-语义检查
 * 	-字节码验证
 *  -二进制兼容性的验证
 * 	类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据
 * 合并到虚拟机的运行时环境中去。
 * -----------------------------------------
 * 类的准备:
 *  在准备阶段,java虚拟机为类的静态变量分配内存,并设置默认的初始值。
 * 类的解析:
 * 	在解析阶段,java虚拟机会把类的二进制数据中的符号引用替换为直接引用。
 * 类的初始化:
 * 	在初始化阶段,java虚拟机执行类的初始化语句,为类的静态变量赋予初始值,
 *。在程序中,静态变量的初始化有两种途径:1,在静态变量的声明处初始化;2,在
 *静态代码块中初始化。
 *
 * 
 * 
 * @author 180719-2
 *
 */
public class Singleton {

	
	//private static Singleton singleton = new Singleton();
	public static int count1;
	public static int count2 = 0;
	private static Singleton singleton = new Singleton();
	
	public Singleton(){
		count1++;
		count2++;
	}
	
	public static Singleton getInstance(){
		return singleton;
	}
}


package nine4one;

public class Test{
	public static void main(String[] args) throws Exception{
		Singleton singleton = Singleton.getInstance();
		System.out.println("count1 = " + singleton.count1);
		System.out.println("count2 = " + singleton.count2);
		
		
//		Class clazz = Class.forName("java.lang.String");
//		System.out.println(clazz.getClassLoader());
//		
//		Class clazz2 = Class.forName("eightsix2.CglibProxyFactory");
//		System.out.println(clazz2.getClassLoader());
	}
}

 

你可能感兴趣的:(java基础)