zoukankan      html  css  js  c++  java
  • java中类的加载过程和对象的创建过程

    1.类加载过程

    首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到方法区。在类的加载过程中,该类的静态成员变量(static)加载到方法区的静态区域,非静态成员变量加载到方法区的非静态区域。加载静态成员变量时,会根据书写的顺序,将所有的静态成员变量加载到方法区的静态区域。然后给所有的静态成员变量赋默认值,然后,根据静态成员变量的书写位置,给静态成员变量赋显示值。赋值完成后,再去根据位置执行静态代码块。执行完代码块后,类加载完成。

    类加载步骤:

    1.jvm先去方法区中寻找有没有相应类的.class文件。如果有,就直接运行使用,如果没有,则把相应类的.class加载到方法区

    2..class的加载过程,先加载该类的非静态内容,再加载静态内容

    3.加载非静态内容:把.class中所有非静态内容(包括成员变量和方法)全部加载到方法区中的非静态区域内、

    4.加载静态内容:

      1.把.class中所有的静态内容(包括静态成员变量和静态方法)全部加载到方法区的静态区域

      2.静态内容加载完成后,静态成员变量或者静态代码块的执行过程,则要根据他们定义的位置来。不过我们一般将静态成员变量定义在前面,静态代码块定义

      在最后面。因此一般过程如下

      3.根据位置进行静态成员变量的初始化

      3.所有的静态成员变量默认初始化完成后,再进行他们的显示初始化

      4.当静态区域下的所有静态成员变量显示初始化完成后,根据顺序执行静态代码块

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

    2.对象创建过程

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

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

      3.把对象的所有非静态成员变量加载到堆中开辟的空间下

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

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

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

        6.1隐式三步

          1.执行super构造

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

          3.执行构造代码块

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

        

       

    .1.

    类加载过程:

     

    首先,

    jvm

    在执行时,遇到一个新的类时,会到内存中的方法区去找

    class

    文件,如果找到

    就直接拿来用,如果没有找到,就会到硬盘中去找到这个

    class

    文件,将类文件加载到方法

    区,

    在类加载时,

    静态成员变量加载到方法区的静态区域,

    非静态成员变量加载到方法区的

    非静态区域,

    加载静态成员变量的时候,

    会根据书写的顺序,

    将所有的静态成员变量加载到

    静态方法区,

    然后给所有的静态成员变量赋默认值,

    赋完默认值后,

    会根据静态成员变量书

    写的位置,

    给静态成员变量赋显示值,和执行静态代码。

    当执行完所有的静态代码块时,类

    才算加载完成。

     

     

    类加载过程:

     

    1

     

    JVM

    会先去方法区中找有没有相应类的

    .class

    存在。如果有,就直接使用;如果没有,

    则把相关类的

    .class

    加载到方法区

     

    2

     

    .class

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

     

    3

     

    加载非静态内容:把

    .class

    中的所有非静态内容加载到方法区下的非静态区域内

     

    4

     

    加载静态内容:

     

    4.1

    、把

    .class

    中的所有静态内容加载到方法区下的静态区域内

     

    4.2

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

     

    4.3

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

     

    4.4

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

     

    5

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

     

     

     

    2.

    对象创建过程:

     

    1

     

    在堆内存中开辟一块空间

     

    2

     

    给开辟空间分配一个地址

     

    3

     

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

     

    4

     

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

     

    5

     

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

     

    6

     

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

    中书写的代码

     

    6.1

    隐式三步:

     

    1

    ,执行

    super

    语句

     

     

     

     

     

    (继承时讲解)

     

    2

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

     

    3

    ,执行构造代码块

     

     

     

     

    6.2

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

     

    7

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

  • 相关阅读:
    C#读写txt文件的两种方法介绍
    C#委托的介绍(delegate、Action、Func、predicate)
    C#邮件发送
    ASP.NET 文件上传于下载
    关于Virtual Box虚拟机里的系统不能启动的解决方法
    unity的yield
    unity文件路径
    手机上的unity路径
    readonly
    unity延迟加载图片
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/7876419.html
Copyright © 2011-2022 走看看