@@ -748,7 +748,7 @@ public static 返回值类型 方法名(参数) {
748748
749749重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
750750
751- 重载仅针对**同一个类**中方法的名称与参数进行识别,** 与返回值无关**, 不能通过返回值来判定两个方法是否构成重载
751+ 重载仅针对同一个类中方法的名称与参数进行识别, 与返回值无关,** 不能通过返回值来判定两个方法是否构成重载**
752752
753753原理:JVM → 运行机制 → 方法调用 → 多态原理
754754
@@ -4426,7 +4426,7 @@ public class Student implements Comparable<Student>{
44264426
44274427Queue:队列,先进先出的特性
44284428
4429- PriorityQueue 是优先级队列,底层存储结构为 Object[],默认实现为小顶堆
4429+ PriorityQueue 是优先级队列,底层存储结构为 Object[],默认实现为小顶堆,每次出队最小的元素
44304430
44314431构造方法:
44324432
@@ -8057,7 +8057,7 @@ public class UserServiceTest {
80578057
80588058反射提供了一个Class类型:HelloWorld.java → javac → HelloWorld.class
80598059
8060- * `Class c = HelloWorld.class; `
8060+ * `Class c = HelloWorld.class`
80618061
80628062注意:反射是工作在**运行时**的技术,只有运行之后才会有 class 类对象
80638063
@@ -9544,7 +9544,7 @@ Java 编译器输入的指令流是一种基于栈的指令集架构。因为跨
95449544
95459545### 生命周期
95469546
9547- JVM的生命周期分为三个阶段 ,分别为:启动、运行、死亡。
9547+ JVM 的生命周期分为三个阶段 ,分别为:启动、运行、死亡。
95489548
95499549- **启动**:当启动一个 Java 程序时,通过引导类加载器(bootstrap class loader)创建一个初始类(initial class),对于拥有 main 函数的类就是 JVM 实例运行的起点
95509550- **运行**:
@@ -11645,7 +11645,7 @@ Java 对象创建时机:
1164511645
1164611646 * 实例初始化不一定要在类初始化结束之后才开始
1164711647
11648- * 在同一个类加载器下,一个类型只会被初始化一次。所以一旦开始初始化一个类,无论是否完成后续都不会再重新触发该类型的初始化阶段了(只考虑在同一个类加载器下的情形。因此,在实例化上述程序中的st变量时 ,**实际上是把实例初始化嵌入到了静态初始化流程中,并且在上面的程序中,嵌入到了静态初始化的起始位置**,这就导致了实例初始化完全发生在静态初始化之前,这也是导致a为110 b为0的原因
11648+ * 在同一个类加载器下,一个类型只会被初始化一次。所以一旦开始初始化一个类,无论是否完成后续都不会再重新触发该类型的初始化阶段了(只考虑在同一个类加载器下的情形。因此,在实例化上述程序中的 st 变量时 ,**实际上是把实例初始化嵌入到了静态初始化流程中,并且在上面的程序中,嵌入到了静态初始化的起始位置**,这就导致了实例初始化完全发生在静态初始化之前,这也是导致 a 为 110,b 为 0 的原因
1164911649
1165011650 代码等价于:
1165111651
@@ -11783,7 +11783,6 @@ Java 对象创建时机:
1178311783
1178411784类变量初始化:
1178511785
11786- * static 变量在 JDK 7 之前存储于 instanceKlass 末尾,从 JDK 7 开始,存储于 _java_mirror 末尾
1178711786* static 变量分配空间和赋值是两个步骤:**分配空间在准备阶段完成,赋值在初始化阶段完成**
1178811787* 如果 static 变量是 final 的基本类型以及字符串常量,那么编译阶段值就确定了,准备阶段会显式初始化
1178911788* 如果 static 变量是 final 的,但属于引用类型或者构造器方法的字符串,赋值在初始化阶段完成
@@ -11814,14 +11813,14 @@ Java 对象创建时机:
1181411813
1181511814将常量池中类、接口、字段、方法的**符号引用替换为直接引用**(内存地址)的过程:
1181611815
11817- * 符号引用:一组符号来描述目标,可以是任何字面量,属于编译原理方面的概念如 :包括类和接口的全限名、字段的名称和描述符、方法的名称和**方法描述符**
11816+ * 符号引用:一组符号来描述目标,可以是任何字面量,属于编译原理方面的概念,如 :包括类和接口的全限名、字段的名称和描述符、方法的名称和**方法描述符**
1181811817* 直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄,如果有了直接引用,那说明引用的目标必定已经存在于内存之中
1181911818
1182011819解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等
1182111820
1182211821* 在类加载阶段解析的是非虚方法,静态绑定
1182311822* 也可以在初始化阶段之后再开始解析,这是为了支持 Java 的**动态绑定**
11824- * 通过解析操作,符号引用就可以转变为目标方法在类中虚方法表中的位置 ,从而使得方法被成功调用
11823+ * 通过解析操作,符号引用就可以转变为目标方法在类的虚方法表中的位置 ,从而使得方法被成功调用
1182511824
1182611825```java
1182711826public class Load2 {
@@ -11853,7 +11852,7 @@ class D {
1185311852
1185411853初始化阶段才真正开始执行类中定义的 Java 程序代码,在准备阶段,类变量已经赋过一次系统要求的初始值;在初始化阶段,通过程序制定的计划去初始化类变量和其它资源,执行 <clinit>
1185511854
11856- 在编译生成 class 文件时,编译器会产生两个方法加于 class 文件中,一个是类的初始化方法 clinit, 另一个是实例的初始化方法 init
11855+ 在编译生成 class 文件时,编译器会产生两个方法加于 class 文件中,一个是类的初始化方法 clinit, 另一个是实例的初始化方法 init
1185711856
1185811857类构造器 <clinit>() 与实例构造器 <init>() 不同,它不需要程序员进行显式调用,在一个类的生命周期中,类构造器最多被虚拟机**调用一次**,而实例构造器则会被虚拟机调用多次,只要程序员创建对象
1185911858
@@ -12010,7 +12009,7 @@ init 指的是实例构造器,主要作用是在类实例化过程中执行,
1201012009从 Java 虚拟机规范来讲,只存在以下两种不同的类加载器:
1201112010
1201212011- 启动类加载器(Bootstrap ClassLoader):使用 C++ 实现,是虚拟机自身的一部分
12013- - 自定义类加载器(User-Defined ClassLoader):Java虚拟机规范 **将所有派生于抽象类 ClassLoader 的类加载器都划分为自定义类加载器**,使用 Java 语言实现,独立于虚拟机
12012+ - 自定义类加载器(User-Defined ClassLoader):Java 虚拟机规范 **将所有派生于抽象类 ClassLoader 的类加载器都划分为自定义类加载器**,使用 Java 语言实现,独立于虚拟机
1201412013
1201512014从 Java 开发人员的角度看:
1201612015
@@ -13599,7 +13598,7 @@ VM 参数设置:
1359913598
1360013599Java 虚拟机识别方法的关键在于类名、方法名以及方法描述符(method descriptor)
1360113600
13602- * 方法描述符是由方法的参数类型以及返回类型所构成,也叫方法特征签名
13601+ * ** 方法描述符是由方法的参数类型以及返回类型所构成**,Java 层面叫方法特征签名
1360313602* 在同一个类中,如果同时出现多个名字相同且描述符也相同的方法,那么 Java 虚拟机会在类的验证阶段报错
1360413603
1360513604JVM 根据名字和描述符来判断的,只要返回值不一样,其它完全一样,在 JVM 中是允许的,但 Java 语言不允许
@@ -15514,7 +15513,7 @@ public class SelectSort {
1551415513
1551515514实现思路:
1551615515
15517- 1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,并通过上浮对堆进行调整,此堆为初始的无序区,堆顶为最大数
15516+ 1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,并通过上浮对堆进行调整,此堆为初始的无序区,** 堆顶为最大数**
1551815517
15519155182. 将堆顶元素 R[1] 与最后一个元素 R[n] 交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区 Rn,且满足 R[1,2…n-1]<=R[n]
1552015519
0 commit comments