首页 > 试题广场 >

以下哪项不属于java类加载过程?

[单选题]
以下哪项不属于java类加载过程?
  • 生成java.lang.Class对象
  • int类型对象成员变量赋予默认值
  • 执行static块代码
  • 类方法解析
推荐
不应该选D,而应该选B
类的加载包括:加载,验证,准备,解析,初始化。
选项A:生成java.lang.Class对象是在加载时进行的。生成Class对象作为方法区这个类的各种数据的访问入口。
选项B:既然是对象成员,那么肯定在实例化对象后才有。在类加载的时候会赋予初值的是类变量,而非对象成员。
选项C:这个会调用。可以用反射试验。
选项D:类方法解析发生在解析过程。
编辑于 2015-12-18 10:07:19 回复(11)

类加载过程

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。如图所示。
这里写图片描述
加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。以下陈述的内容都已HotSpot为基准。

加载

在加载阶段(可以参考java.lang.ClassLoader的loadClass()方法),虚拟机需要完成以下3件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class文件中获取,可以从其他渠道,譬如:网络、动态生成、数据库等);
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口;

加载阶段和连接阶段(Linking)的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。

验证

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

  1. 文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以魔术0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。
  2. 元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析),以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。
  3. 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。
  4. 符号引用验证:确保解析动作能正确执行。

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

准备

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:

1
publicstaticintvalue=123;

那变量value在准备阶段过后的初始值为0而不是123.因为这时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中,所以把value赋值为123的动作将在初始化阶段才会执行。
至于“特殊情况”是指:public static final int value=123,即当类字段的字段属性是ConstantValue时,会在准备阶段初始化为指定的值,所以标注为final之后,value的值在准备阶段初始化为123而非0.

解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

初始化

类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。在准备极端,变量已经付过一次系统要求的初始值,而在初始化阶段,则根据程序猿通过程序制定的主管计划去初始化类变量和其他资源,或者说:初始化阶段是执行类构造器<clinit>()方法的过程.

<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块static{}中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的,静态语句块只能访问到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问
原文链接  http://www.importnew.com/18548.html
发表于 2016-05-12 20:06:00 回复(53)
类方法解析及时调用使用类方法,这个应该属于程序调用的时候。
发表于 2015-11-23 16:23:10 回复(1)
java类加载过程如图所示

编辑于 2019-10-21 17:04:28 回复(12)
成员变量不会被初始化,只有静态变量会被初始化,选B
发表于 2018-09-02 08:54:27 回复(5)

类加载过程:

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

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

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

4, 加载静态内容:

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

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

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

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

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

发表于 2016-11-25 13:49:33 回复(1)
做选择题 肯定是有技巧可言的   int类型对象成员变量赋予默认值肯定是编译时候就做了啊 那就不是类加载的时候才做的啊 所以说 要选择B
发表于 2016-03-21 15:57:03 回复(7)
类加载包括5个阶段:加载,验证,准备,解析,初始化。
A. 生成java.lang.Class对象: 加载阶段
B. int类型对象成员变量赋予默认值:使用阶段(不属于类加载阶段)
C. 执行static块代码:初始化阶段(执行类构造器<clinit>()方法)
D. 类方法解析:解析阶段
编辑于 2019-12-23 22:52:20 回复(0)
类方法在调用时解析
发表于 2015-10-16 22:02:15 回复(1)
因为不是静态的,所以堆内存中必须创建对象后给成员变量赋默认初始值
发表于 2016-05-05 22:42:09 回复(0)
变量分为成员变量和局部变量,而成员变量又分为类变量和实例变量。
类变量由static修饰,在linking的prepare阶段进行默认赋值,在initial阶段显式赋值。实例变量随着对象的创建,在堆空间中为它分配空间,然后默认赋值
局部变量必须手动赋值
发表于 2020-07-01 18:25:28 回复(0)
类方法解析应该是在对象调用的时候啊。
发表于 2016-01-10 20:51:41 回复(0)
其实这个里面可能就b比较模糊一点。b是成员变量,是属于类自己本身的,在加载类时成员变量也是会一起加载的。这是我的个人理解
发表于 2015-11-02 16:31:08 回复(1)
B选项既然是对象,当然是在类加载后完成的
发表于 2018-10-27 19:45:40 回复(0)
变量分为成员变量和局部变量,而成员变量又分为类变量和实例变量。 类变量由static修饰,在linking的prepare阶段进行默认赋值,在initial阶段显式赋值。实例变量随着对象的创建,在堆空间中为它分配空间,然后默认赋值 局部变量必须手动赋值
发表于 2022-11-12 13:52:17 回复(0)
加载阶段 连接阶段:1.验证阶段2.准备阶段(静态变量分配内存然后默认初始化,内存是方法区的)3.解析阶段 初始化阶段 B选项是对象成员,如果是静态变量就是对的,对象是new和类加载不同
发表于 2022-05-06 11:46:28 回复(0)
实例化才会初始成员变量,生成class文件是在加载过程中实现。
发表于 2021-07-14 15:33:47 回复(0)
B、准备阶段只对static类变量分配内存和设置初始值。
非static的类变量到创建对象执行init方法时才分配空间进行初始化。
发表于 2020-04-09 14:05:59 回复(0)
类加载过程中,只有静态变量能够初始化。 被final修饰的静态变量初始化为赋予的值,没有被final修饰的静态变量初始化为'零'。
发表于 2023-05-30 20:49:50 回复(0)
类加载过程中,只有静态变量被初始化
发表于 2022-12-01 14:59:31 回复(0)
jvm的类加载过程分为以下部分。
1.加载过程。【将硬盘文件读到jvm自己内存中】
将硬盘上的文件class文件通过二进制字节流【静态存储结构】的形式转换成方法区运行时数据结构【在jvm内存中生成对象代表这个class,作为方法区这个类的各种数据入口】

2.链接
    2.1 验证
            通过加载过程之后,硬盘上的字节码文件已经到了内存了,现在在内存中验证下这个文件是否合法,来保证jvm本身的安全性。
            验证方式:文件格式验证,元数据验证,字节码验证,符号引用验证
    2.2 准备
            这个时候内存中的class文件都是安全的。可以对静态变量进行赋值了。
            注意: 1.final修饰的static在编译的时候就已经分配了,准备阶段就显示初始化了。
                        2.不会为实例变量分配初始化。  类变量会分配在方法区中,实例变量和对象一起在java堆中。

    2.3 解析
            将常量池内符号引用转换为直接引用的过程


3.初始化
    初始化阶段就是执行类构造方法<clinit>()方法的过程(若该类中没有类变量,则不执行<clinit>())

发表于 2022-09-01 11:25:58 回复(0)