类加载学习

1.在Java里可以通过几种方法创建对象?
通过new的方式
通过Class.classForname('xxxxxx');
通过Class.newInstance
通过序列化

一般是分配内存,初始化默认赋值,然后才实例化。
初始化有分为:实例变量初始化、实例代码块初始化 以及 构造函数初始化,
其中实例变量的初始化和实例代码块的初始化在构造函数的初始化之前。
如果类有继承关系,则顺序是:
父类的类构造器() -> 子类的类构造器() -> 父类的成员变量和实例代码块 -> 父类的构造函数 -> 子类的成员变量和实例代码块 -> 子类的构造函数

2.一个类加载的一般流程是怎样子的?

类初始化的时机,及什么时候会触发一个类开始初始化?
以下几种情况会触发类的初始化流程:

特别注意,以下的几种情况不会触发类的初始化:
1.子类直接引用父类的静态变量,不会触发子类的初始化。
2.通过数组定义某个引用类,不会触发该类的初始化。

加载 验证 准备 解析 初始化 使用 卸载
正式为所有的类静态变量分配内存并 初始化阶段是执行类构造器()方法的过程。
设置初始化的值。例如 1.虚拟机会保证一个类的类构造器被正确的加锁,如果多个线程同时去初始化一个类,只会有一个线程会去执行类构造器,其他线程会被阻塞。当执行执行类构造器执行完毕推出后,其他线程不会再执行类构造器
int a = 1;//会被设定默认值0 2.类构造器本质上是编译器收集所有静态语句块和类变量的赋值语句按语句在源码中的顺序合并生成类构造器()
String b;//会被设定默认值null。
特别地,如果是
Static final int a = 1;//被关键字final修饰的话,会在准备阶段就赋值1

特别注意类的初始化和类的实例化的区别:
类的初始化,是指类在加载过程中的一个阶段,在初始化阶段会对类的变量进行赋值的过程;
类的实例化,指类在完成加载到内存后创建对象的过程。

3.类加载器
什么是类加载器,有什么作用?
加载类到jvm里面
这3钟类加载器有什么关联和区别?
- Bootstrap
- Extension
- System

什么是双亲委任制?
一般类加载器收到加载类的请求是,都会先把请求提交给父加载器,一直到Bootstrap加载器。从下往上检查该类是否已经被加载,如果已经加载,则直接返回该类的实例。自上往下挨个尝试是否可以加载该类,如果可以加载则加载该类,返回类的实例。如果最后无法加载该类,则抛出ClassNotFoundException的异常

学习这个有啥用啊?有什么应用场景?

posted on 2020-01-27 15:52  lukelin1989  阅读(83)  评论(0编辑  收藏  举报

导航