当前位置:首页 » 编程语言 » java类加载的顺序

java类加载的顺序

发布时间: 2023-05-14 12:13:15

java程序运行的五个步骤

1、Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言("semi-interpreted" language)。

第一步(编译): 创建完源文件之后,程序会先被编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点像make。如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。

编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的所有token(类名,成员变量名等等)以及符号引用(方法引用,成员变量引用等等);方法字节码放的是类中各个方法的字节码。

第二步(运行):java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。

2、下面是程序运行的详细步骤:

  • 在编译好java程序得到Main.class文件后,在命令行上敲java Main。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为Main.class的二进制文件,将Main的类信息加载到运行时数据区的方法区内,这个过程叫做Main类的加载。

  • 然后JVM找到Main的主函数入口,开始执行main函数。

  • main函数的第一条命令是Animal animal = new Animal("Puppy");就是让JVM创建一个Animal对象,但是这时候方法区中没有Animal类的信息,所以JVM马上加载Animal类,把Animal类的类型信息放到方法区中。

  • 加载完Animal类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Animal实例分配内存, 然后调用构造函数初始化Animal实例,这个Animal实例持有着指向方法区的Animal类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用。

  • 当使用animal.printName()的时候,JVM根据animal引用找到Animal对象,然后根据Animal对象持有的引用定位到方法区中Animal类的类型信息的方法表,获得printName()函数的字节码的地址。

  • 开始运行printName()函数。

Ⅱ java类加载问题。不要告诉我结果,我问的是为什么会是这样的结果,加载顺序是什么

加载类、 静态成员变量初始化、 静态代码块、非静态成员变量初始化、 构造方法;
首先 加载类的时候先加载类的静态成员变量. 因为静态变量依赖类,不依赖对象,先加载
public static int k = 0;
public static T t1 = new T("t1"); 加载到这一行的时候就会new一个对象出来,并执行public int j = print("j"); 因为j是成员变量,依赖对象.
所以在对象初始化的时候才加载. 然后加载非静态的构造块 构造方法. t2静态变量同理.
t1 t2加载的时候,i n 并未初始化.因为静态变量i , n 在静态变量t1,t2后,所以i, n 就为0开始.
public static int i = print("i"); 加载到静态变量i时,执行print方法.
当所有静态变量加载完成后,加载静态块.
类的加载和对象的初始化是不一样的.

Ⅲ java 类加载先后顺序

父类态代码块
父类静态属性
//以上根据代码顺序
子类静态属性
子类静态代码块
//以上根据代码顺序
父类属性
父类代码块
//以上根据代码顺序
父类构造器
子类属性
子类代码块
//以上根据代码顺序
子类构造方法
子类方法
父类方法
父类静态方法
子类静态方法

package com.zz;

/**
* Created by @摩西摩西 2020/3/21 22:29
**/
public class Father {
public String name=Son.getmetod("父类属性");
public Father(){
System.out.println("父类构造器");
}
{
System.out.println("父类代码块");
}
public void fatherMethod(){
System.out.println("父类方法");
}

static {
System.out.println("父类态代码块");
}
static String name1=Son.getmetod("父类静态属性");
public static void fatherStaticMethod(){
System.out.println("父类静态方法");
}
}
package com.zz;

/**
* Created by @摩西摩西 2020/3/21 22:32
**/
public class Son extends Father {
public String name = getmetod("子类属性");

public Son() {
System.out.println("子类构造方法");
}

{
System.out.println("子类代码块");
}
public void sonMethod(){
System.out.println("子类方法");
}

public static String name1 = getmetod("子类静态属性");

static {
System.out.println("子类静态代码块");
}

public static void sonStaticMethod() {
System.out.println("子类静态方法");
}

public static String getmetod(String s) {
System.out.println(s);
return s;
}

public static void main(String[] args) {
Son son= new Son();
son.sonMethod();
son.fatherMethod();
fatherStaticMethod();
sonStaticMethod();
}
}

Ⅳ java的类加载器有哪些,它们的顺序是什么

类加载器有四种,分别是 bootstrapClassLoader (主要加载java核心api) , ExtClassLoaders是扩展类的类加载器,AppClassLoader 程序类加载器,还有一个是用户继承ClassLoader重写的类加载器。

Ⅳ JVM之class加载过程

java虚拟机把描述类的数据从class文件加载到内存,并对数据进行 校验/准备/解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。

称作虚拟机的类加载机制。

loading -> linking (verification -> preparation -> resolution)-> resolution)->initializing

loading: 把class文件load到内存中,采用双亲委派,主要是为了安全性

verification: 校验class文件是否符合标准

preparation: 静态变量分配内存并设初始值的阶段(不包括实例变量)

resolution:把符号引用转换为直接引用

initializing:静态变量赋初始值

类加载的过程主要分为三个部分:加载、连接、初始化这三个阶段。

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。主要步骤可以分为下面的三件事情:

加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。

类的加载的最终产品是位于堆区中的Class对象。Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。加载类的方式有以下几种:

2.加载器

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

1.BootstrapClassLoader(启动类加载器)

在连接里面又可以被分成3个小阶段,分别是:验证,准备,解析

1.验证(目的):

2.验证内容:

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段大致会完成4个阶段的检验动作:

验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

3.准备:

在准备阶段,为静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。jvm默认为静态变量的初值是这样的

4.解析:

这一阶段的任务就是把常量池中的符号引用转换为直接引用 什么是符号引用,什么是直接引用。

1.工作内容:

JVM负责主要对类变量(类变量就是static修改的变量)进行初始化这里主要对类变量(类变量就是static修改的变量)进行初始化,初始化主要有两个方式:

2.初始化时机:

类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

3.初始化顺序:

如果有父类,则顺序是:父类static方法/static变量赋值 –> 子类static方法/static变量赋值

三、结语:

上面介绍的就是类(class)的加载,包含它的加载、链接、初始化。
Android进阶知识点,我最近整理了许多,里面讲解的非常详细。取
https://docs.qq.com/doc/DUkNRVFFzTG96VHNiAndroid 技术进阶手册丶面试题纲丶核心笔记资料。

热点内容
8吨桥在配置怎么看 发布:2025-07-18 02:20:03 浏览:376
服务器防御怎么看 发布:2025-07-18 02:19:54 浏览:394
idlj编译idl文件 发布:2025-07-18 02:14:47 浏览:352
国外代理服务器ip地址和端口 发布:2025-07-18 02:12:44 浏览:720
将个人电脑改云桌面服务器 发布:2025-07-18 02:12:31 浏览:758
加密机进程 发布:2025-07-18 02:08:34 浏览:241
光遇源码 发布:2025-07-18 01:36:52 浏览:609
一克拉算法 发布:2025-07-18 01:36:16 浏览:881
sql的标准 发布:2025-07-18 01:31:19 浏览:418
za解压怎么用 发布:2025-07-18 01:15:43 浏览:39