文章目录
- 1. 常量池集合
- 2. 访问标志
- 3. 字段表集合
- 4. 方法表集合
- 5. 属性表集合
成员变量(非静态)的赋值过程:1. 默认初始化 2. 显示初始化/代码块中初始化 3. 构造器中初始化 4. 有了对象后对象。属性或者对象。方法的方式对成员变量进行赋值
属性没有多态、方法才有多态
1. 常量池集合
用于存放编译时期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
字面量:字符串、声明为 final 的常量值
(常量值就是八种基本数据类型)
符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符
口述:比如说我们定义了一个类,在类中定义了一些属性和方法,那有关这个类、属性、方法在常量池中都可以找到,像类的全限定名啊、方法返回值啊参数啊方法所属的类啊、属性所属的类啊属性名字啊都在常量池中的。像我们用jclasslab解析class文件也都可以看到这些结构的。
补充说明:
虚拟机在加载 Class 文件时才会进行动态链接
,也就是说,Class 文件中不会保存各个方法和字段的最终内存布局信息
。因此,这些字段和方法的符号引用不经过转换是无法直接被虚拟机
使用的。当虚拟机运行时,需要从常量池中获得对应的符号引用,再在类加载过程中的解析阶段
将其替换为直接引用
,并翻译到具体的内存地址
中。
2. 访问标志
这个 Class 是类还是接口;是否定义为 public 类型;是否定义为 abstract 类型
3. 字段表集合
口述:记录了我们在类中声明的属性的信息,包括属性名字、访问权限啊、是否是static修饰啊、是否是final修饰啊这些描述属性的信息。
用于描述接口或类中声明的变量。包括类变量
以及实例变量
,但是不包括方法内部
、代码块内部
声明的局部变量
。
4. 方法表集合
口述:方法表集合描述了我们定义在类中的所有方法的描述信息,包括方法名字、访问修饰符、方法的返回值类型啊方法的参数信息啊,以及方法内部的属性的信息啊等等。
- 每一个
method_info
项都对应着一个类或者接口中的方法信息。比如方法的访问修饰符
(public、private 或 protected),方法的返回值类型
以及方法的参数信息
等。 - 如果这个方法不是抽象的或者不是 native 的,那么字节码中会体现出来。
- methods 表
只描述当前类或接口中声明的方法
,不包括
从父类或父接口继承的方法。但methods 有可能会出现由编译器自动添加的方法,最典型的便是编译器产生的方法信息(比如:类(接口)初始化方法
<clinit>()和实例初始化方法
<init>()
5. 属性表集合
比如说 Code 属性就存放了方法里面的具体的代码, LineNumberTable 属性描述了我们写的代码和字节码指令的这种对应关系, LocalVariableTable 属性描述了局部变量的信息。