Java 之虚拟机

来源:互联网 发布:绣花软件免费下载 编辑:程序博客网 时间:2024/06/07 01:25

1.程序中对子类的“主动使用”会导致父类的初始化,但对父类的“主动使用”并不会导致子类的初始化。

2.类的加载,连接与初始化

加载:查找并加载类的二进制数据(字节码文件);

连接:

------验证:确保被加载类的正确性;

------准备:为类的静态变量分配内存,并将其初始化为默认值;

------解析:把类中的符号引用转换为直接引用

初始化:为类的静态变量赋予正确的初始值(静态变量,静态代码块);

3.类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区的数据结构。

8888

4.类的加载:主动使用(六种)

——创建类的实例;

——访问某个类或接口的静态变量,或者对该静态变量赋值;

——调用类的静态方法;

——反射(如Class.forName("java.lang.String"));

——初始化一个类的子类(对父类的主动使用);

——Java虚拟机启动时被标明为启动类的类(含有main方法);

1.类加载器的父亲委托机制Parent Delegation):

类加载器用来将类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能更好的保证Java平台的安全性。在这种委托机制中,除了Java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父类加载器。当Java程序请求加载器Loader1加载类Sample时,loader1首先委托自己的父加载器去加载Sample类,若父加载器能加载,则有父加载器完成任务,否则才有加载器Loader1本身去加载Sample类。

2.Java虚拟机自带了以下几种加载器

根类加载器(Bootstrap)类加载器:该加载器没有父类加载器,它负责加载虚拟机的核心类库,根类加载器的实现依赖底层操作系统,属于虚拟机实现的一部分,它并没有继承java.lang.ClassLoader类。

扩展类(Extension)加载器:它的父加载器是根类加载器,扩展类加载器是纯Java类,是java.lang.ClassLoader类的子类。

系统类(System)加载器:也称为应用类加载器,它的父加载器是根类加载器,它是用户自定义的类加载器的默认父类加载器,系统类加载器是纯Java类,是java.lang.ClassLoader类的子类。

父子加载器并非继承关系,也就是说子加载器并不一定是继承了父加载器。

3.Java类加载器之间的关系:

**********************

请求加载从下到上,加载顺序从上到下。

4.定义类加载器:如果某个类加载器能成功的加载一个类,那么该类加载器就称为定义类加载器;定义类加载器及其子加载器都称为初始类加载器

5.命名空间:每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器加载的类组成。同一个命名空间中的类是相互可见的,不同的命名空间中的类是相互不可见的,即不能相互访问(通过反射机制可以实现访问)。

6.运行时包:由同一类加载器加载的属于相同包的类组成。

7.类的卸载:一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。

原创粉丝点击