Java中类加载过程和对象创建过程

摘要:
类加载过程:1.JVM将首先转到方法区域,以确定是否存在相应的类Class。可以存储本地信息。功能:首先,然后,堆外:用于存储实体。特点:1.每个实体打开的空间都有一个地址。2.每个实体中存储的数据都有一个默认的初始值方法区域:存储类和静态。方法区域实际上由N个小区域组成。

类加载过程:

1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容

3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内

4, 加载静态内容:

    4.1、把.class中的所有静态内容加载到方法区下的静态区域内

    4.2、静态内容加载完成之后,对所有的静态变量进行默认初始化

    4.3、所有的静态变量默认初始化完成之后,再进行显式初始化

    4.4、当静态区域下的所有静态变量显式初始化完后,执行静态代码块

5,当静态区域下的静态代码块,执行完之后,整个类的加载就完成了。

对象创建过程:

1, 在堆内存中开辟一块空间

2, 给开辟空间分配一个地址

3, 把对象的所有非静态成员加载到所开辟的空间下

4, 所有的非静态成员加载完成之后,对所有非静态成员变量进行默认初始化

5, 所有非静态成员变量默认初始化完成之后,调用构造函数

6, 在构造函数入栈执行时,分为两部分:先执行构造函数中的隐式三步,再执行构造函数中书写的代码

    6.1、隐式三步:

        1,执行super语句

        2,对开辟空间下的所有非静态成员变量进行显式初始化

        3,执行构造代码块

    6.2、在隐式三步执行完之后,执行构造函数中书写的代码

7,在整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象

总结类中能书写的成员

栈: 用来运行函数。可以存储局部信息

     特点:先进后出

堆:用来存储实体(被new创建出来的)。

特点:

1,  每一个实体所开辟的空间都有一个地址

2,  每一个实体中存储的数据都有一个默认初始值

方法区:存放class和static。 方法区其实是由N多个小的区域构成。有存放非静态内容的非静态区域,还有存放静态内容的静态区域,还有存放常量的常量池 等

class  ABC

{

         非静态成员变量

         静态成员变量

        非静态成员函数

        静态成员函数

构造函数:ABC(...){...}

静态代码块: static {...}

构造代码块 :  {...}

}

 图解调用过程:

Java中类加载过程和对象创建过程第1张

  

对象创建过程代码和注释:

[java] view plain copy
 
  1. class Person {  
  2.     int age;  
  3.   
  4.     Person(int age) {  
  5.         this.age = age;  
  6.     }  
  7. }  
  8.   
  9. class Student extends Person {  
  10.     // 2,对开辟空间下的所有非静态成员变量进行显式初始化  
  11.     String school = "abc";  
  12.   
  13.     Student(String school, int age) {  
  14.         // 1,执行super语句  
  15.         super(age);  
  16.         // 4、在隐式三步执行完之后,执行构造函数中书写的代码  
  17.         this.school = school;  
  18.     }  
  19.   
  20.     {  
  21.         // 3,执行构造代码块  
  22.         System.out.println("Student code block");  
  23.     }  
  24. }  

免责声明:文章转载自《Java中类加载过程和对象创建过程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇fastjson SerializerFeature详解Hive的基本操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenCV-C++ Mat对象的使用

这一篇文章中主要介绍有关Mat类的使用,主要包括: 通过构造函数定义Mat对象; Mat对象常用属性以及方法 创建一个空白图像并进行赋值 创建一个小数组 通过构造函数定义Mat对象 Mat中提供了很多的构造函数,这里使用两种方式: Mat(Size size, int type); Mat(int rows, int cols, int type, c...

Android系统编程入门系列之界面Activity响应丝滑的传统动画

上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化。然而不管是启动一个界面执行新界面Activity的生命周期方法,还是视图的相对变化,都需要一段时间,所以在响应的最终结果完成之前是有一段空白时间的。而在这段或长或短的时间里,该怎么给用户展...

Android编译系统环境过程初始化分析【转】

本文转载自:http://blog.csdn.net/luoshengyang/article/details/18928789  Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就是指定编译的类型和目标设备的型号。Android的编译类型主要有eng、userdebug和user三种,而支持的目标设备型号则是不确定的,它们由当前的源码...

u-boot核心初始化

异常向量表:异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。ARM Architecture Reference Manual p54页。7种异常的类型:Reset异常:突然按下重启键。Undefined Instruction:未定义指令。()software interrup:软中断()Prefetch Abo...

权值初始化

设计好神经网络结构以及loss function 后,训练神经网络的步骤如下: 初始化权值参数 选择一个合适的梯度下降算法(例如:Adam,RMSprop等) 重复下面的迭代过程: 输入的正向传播 计算loss function 的值 反向传播,计算loss function 相对于权值参数的梯度值 根据选择的梯度下降算法,使用梯度值更新每个权值参数...

spring启动过程

首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境; 其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个...