Java类的加载方式、类的初始化、类的执行方式
类加载器(ClassLoader),顾名思义,即加载类的东西。
在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。
class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize)
1、由new关键字创建一个类的实例
在由运行时刻用 new 方法载入
例:Person person = new Person();
2、使用Class.forName()
通过反射加载类型,并创建对象实例
例:Class clazz = Class.forName(“Person”);
Object person =clazz.newInstance();
3、使用某个ClassLoader实例的loadClass()方法
通过该 ClassLoader 实例的 loadClass() 方法载入。应用程序可以通过继承 ClassLoader 实现自己的类装载器。
例:Class clazz = classLoader.loadClass(“Person”);
Object person =clazz.newInstance();
区别:
1和2使用的类加载器是相同的,都是当前类加载器(即:this.getClass.getClassLoader)。
3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。即第3种方式加载的类与当前类分属不同的命名空间。
1是静态加载、2、3是动态加载
异常(exception)
静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error;
动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常。
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1.这个类已经加载;2.这个类已经连接了。
new关键字和newInstance()方法的区别:
newInstance:弱类型,低效率,只能调用无参构造;
new:强类型,相对高效,能调用任何Public构造。
初始化:只有在使用时类才会被初始化。
1 初始化,也就是new时候会初始化类
2 访问类或者接口中的静态变量或者对其赋值
3 调用类的静态方法
4 反射(Class.forName("com.geminno");)
5 初始化它的子类,父类也会初始化
6 虚拟机启动时被标明是启动类的类(java Test),直接用java.exe运行某个类;
程序执行结束的几种方式:
1 system.exit();
2 正常执行完毕;
3 程序运行错误,报错
4 系统出现问题,虚拟机停止运行;