`
insertyou
  • 浏览: 868179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

类的生命周期回顾篇

 
阅读更多


一、JAVA虚拟机和JAVA程序的生命周期


JAVA虚拟机的生命周期和JAVA程序的生命周期一致,当我们在命令行中敲入java命令运行java程序时,java虚拟机进程启动,程序运行,当程序终止时,则JAVA虚拟机的生命也结束。


二、类的生命周期


1.加载将.class文件的二进制数据放到内存方法区中,并在堆区中创建一个Class对象,这个Class对象封装了方法区的数据结构,用户能通过Class对象访问到方法区中。

2.连接

(1)验证:验证.class文件是否是通过JAVA程序编译出来的,因为有可能这个.class文件是黑客特意制造出来的。

(2)准备:为类中的静态变量分配空间,并初始化为默认值。
(3)解析:把类的符号引用变为直接引用。

3.初始化:为静态变量和静态块赋予值。

JAVA程序对于类的使用方式:

(1)主动使用。

(2)被动使用。

这里注意:

JAVA虚拟机对于加载和连接的时间节点是很宽松的,没有严格规定,可以提前加载也可以;但是对于初始化,JAVA虚拟机规定当某个类被主动使用时才能初始化。

我们把3个步骤细讲一下:

1.类的加载:类是通过类加载器进行加载。

类加载的来源:

(1)文件系统中的class文件

(2)jar包

(3)网络中下载。

类加载目的地:内存。

类加载器分类:

(1)根类加载器:没有父类,加载java.lang.*。

(2)扩展类加载器:父类是根类加载器,用于加载jre\lib\ext的jar包。

(3)系统类加载器:父类是扩展类加载器,用于加载classpath的jar包。Class scl = Class.getSystemClassLoader();

(4)自定义加载器:自定义加载,通常父类是系统类加载器。

注意:通过类虚拟机自带的(1)(2)(3)加载器是JAVA虚拟机创建的,而他们加载的类,他的生命周期是虚拟机的生命周期,因为始终被加载器锁引用。

2.类的解析

将符号引用转换成直接引用。比如:

A函数调用了B函数,原本只是符号引用即标明引用了B函数,直接引用是将符号改成指针指向B函数。

3.类的初始化

规则:

(1)初始化的静态变量都是运行时变量,即不能在编译时就能判断值是多少。

(2)初始化的顺序就是按照代码的顺序执行。

(3)如果初始化子类时父类还没有被初始化,则先初始化父类。

初始化时机:当遇到以下情况会进行初始化。

(1)new创建实例、反射创建实例、clone创建实例、反序列化创建实例。

(2)访问静态变量,即读和写。

(3)调用静态方法。

(4)启动类需要首先初始化。

(5)Class.forName();

注意:

(1)当遇到编译时常量,则直接用数字替换,而不会导致类初始化。比如public static final int a= 3;这就是一个编译时常量。

(2)当子类对象调用父类的静态变量或方法,则只对父类进行初始化。比如:Sub.a,其中a是父类的静态变量,则只对Base初始化。

(3)当子类被初始化时,父类一定要先初始化;

但是如果一个类实现了一个接口,当类被初始化时,不用初始化父接口。

只有对这个接口进行访问时,才会对接口进行初始化。

(4)loader.loadClass("....");只是对类的加载,而不是初始化。


类加载过程采用“父亲委托机制”,即如果loader2的父类是loader1,loader2想要加载test类,则先会检查loader1是否能够加载test类,如果能,则通过父类加载。

运行时包的概念:包名相同,类加载器相同。

分享到:
评论

相关推荐

    SpringBoot内置生命周期事件详解 SpringBoot源码(十)

    温故而知新,我们来简单回顾一下上篇的内容,上一篇我们分析了SpringBoot启动时广播生命周期事件的原理,现将关键步骤再浓缩总结下: 为广播SpringBoot内置生命周期事件做前期准备:1)首先加载ApplicationListener...

    大数据开发|Flink中的窗口分类和生命周期

    在我们日常使用flink这个框架的过程中,我们会经常使用到窗口,让我们通过下面这篇文章,快速回顾总结一下吧。 Flink 是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地...

    微信小程序开发进阶篇:生命周期、数据绑定与模块化

    一:生命周期   准备写一个小系列,帮...App 函数是整个小程序的入口, 这在我们上篇文章中已经介绍了, 咱们再把代码贴出来回顾一遍: App({  onLaunch: function () {  //调用API从本地缓存中获取数据  var logs

    android基础总结篇之一:Activity生命周期

    近来回顾了一下关于Activity的生命周期,参看了相关书籍和官方文档,也有了不小的收获,对于以前的认知有了很大程度上的改善,在这里和大家分享一下。 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己...

    Java2游戏编程.pdf

    5.3 Applet的组成和生命周期 5.4 一个Applet例子 5.5 运行Java Applets 5.6 通用AWT组件 5.6.1 按钮 5.6.2 单选按钮(Radio Button) 5.6.3 作出重要选择 5.6.4 循环播放声音文件 5.6.5 文本域 5.6.6 标签 5.7 布局...

    Android仿今日头条多个fragment懒加载的实现

    Fragment的生命周期回顾 github代码直通车 (本地下载) 这里是今日头条效果: 自制效果,有图有真相: 实现思路: 使用Fragment类自带方法setUserVisibleHint()判断当前fragment是否对用户可见,根据回调的...

    Android Jetpack架构组件 ViewModel详解

    ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在。这句话很好理解,还记得我们在讲解Lifecycle的时候 举的例子吗,我们还是使用那个例子,...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.7.1 application的生命周期 3.7.2 application中数据的操作 3.7.3 Web应用初始化参数的配置 3.7.4 application对象应用示例 3.8 其他内置对象的应用 3.8.1 应答与请求的page对象 3.8.2 页面上下文的page Context...

    Spring.3.x企业应用开发实战(完整版).part2

    3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.5.2 ApplicationContext中Bean的生命周期 3.6 小结 第4章 在IoC容器中装配Bean 4.1 Spring配置概述 4.1.1 Spring容器高层视图 4.1.2 基于XML的配置 4.2 Bean基本配置 4.2.1 装配一个Bean 4.2.2 Bean的命名 4.3 ...

    2019年python自动化运维进阶篇20期视频教程-百度网盘下载视频

    │ 07 vue 生命周期.51reboot.mp4 │ 08 vue 组件化开发.51reboot.mp4 │ 09 vue 组件通信.51reboot.mp4 │ vue cli 工程.51reboot.mp4 │ ├─08.第八天 │ 01 vue-admin环境.51reboot.mp4 │ 02 vue对接drf.51...

    Java开发技术大全 电子版

    3.2.4对象的生命周期106 3.2.5对象的创建106 3.2.6对象的使用108 3.2.7对象的释放和垃圾收集机制108 3.3成员变量的定义与使用109 3.3.1成员变量的定义109 3.3.2成员变量的访问权限110 3.3.3实例成员变量和...

    老男孩第三期Python全栈开发视频教程 零基础系统学习Python开发视频+资料

    ├─(105) 09 python全栈3 day54 Django请求生命周期之响应内容(一).avi ├─(106) 10 python全栈3 day54 Django请求生命周期之响应内容(二).avi ├─(107) 11 python全栈3 day54 学员管理示例:数据库设计.avi ...

Global site tag (gtag.js) - Google Analytics