[TOC]
# 1、概念:
## 1.1類的加載階段

使用某類時,如果類還沒有加載到內存,則系統會**加載**、**連接**、**初始化**三個步驟對類進行初始化。通常由jvm完成這三個步驟。這三個步驟統稱為類加載或類初始化。
> **1、將類的class文件讀入內存,并為之創建一個java.lang.Class對象。** 也就是說使用一個類時,都會先進行一次(且只有一次)類的加載。
> 2、類的加載由加載器完成,加載器通常由jvm提供
### 1.1.2 類加載源
可以通過以下文件加載:
1. class文件
2. jar文件
3. 通過網絡加載class文件
4. 動態編譯java源文件,并加載
### 1.1.3 類:
> 類,是一類對象的抽象,是一個概念層次上的東西,但是java中一切皆為對象,類也不例外是java.lang.Class的實例。
> java.lang.Class即為類這個對象的抽象(描述)
## 1.2 類的連接階段
### 1. 當類被加載之后,系統為之生成對應的Class對象,接著就會進入**連接階段**。連接階段負責將類的二進制數據合并到jre當中去。
### 2. **連接分為三個階段:**
1) 驗證階段
驗證加載的類是否有正確的內部結構,并且與其他類協調一致。
2) 準備階段
負責為類的類變量分配內存,并設置默認初始值。
3) 解析階段
將類的二進制數據中的符號引用替換成直接引用。
## 1.3 類的初始化階段
### 1.3.1 初始化過程
> 1、該階段有jvm負責對類進行初始化,主要是對類變量進行初始化。
> 2、java對類變量指定初始值有兩種方式:
> ---- 1)**聲明類變量時指定初始值**
> ---- 2)**靜態初始化塊對類變量指定初始值**
> ---- 3)**如果沒有顯示的指定初始值,則初始化為默認值**
> 3、**類初始化語句和靜態初始化塊安裝定義的順序執行**
```
public class Test
{
static
{
// 使用靜態初始化塊為變量b指定出初始值
b = 6;
System.out.println("----------");
}
// 聲明變量a時指定初始值
static int a = 5;
static int b = 9; // ①
static int c;
public static void main(String[] args)
{
System.out.println(Test.b);
}
}
```
### 1.3.2 類初始化時機
**以下使用類或者接口時,都會引起類的初始化:**
1、當創建類的實例時(new 或者反射)
2、調用某類的類方法(靜態方法)
3、調用某個類的或者接口的類變量,或者為類變量賦值
4、初始化某一個類的子類(初始化時,總是會先初始化父類)
5、使用java命令運行某個主類時,當運行某個主類時,程序會先初始化主類。
### 1.3.2 final關鍵字與類初始化
> **1、對于一個final類型的類變量,如果該變量的值編譯期時可確定下來,則這個類變量相當于一個“宏變量”。**
>
> 2、java編譯器會在編譯時,將這個類變量出現的地方替換成它的值,**因此,程序使用改類變量也不會引起類的初始化。**
```
class MyTest
{
static
{
System.out.println("靜態初始化塊...");
}
// 使用一個字符串直接量為static final的類變量賦值
static final String compileConstant = "hello java";
}
public class CompileConstantTest
{
public static void main(String[] args)
{
// 訪問、輸出MyTest中的compileConstant類變量
System.out.println(MyTest.compileConstant); // ①
}
}
```
由于compileConstant這類變量有final關鍵字修飾,并且在編譯時類變量的值就可以被確定下來(一個固定的字符串),所以
- 計算機網絡
- 基礎_01
- tcp/ip
- http轉https
- Let's Encrypt免費ssl證書(基于haproxy負載)
- what's the http?
- 網關
- 網絡IO
- http
- 工具
- Git
- 初始本地倉庫并上傳
- git保存密碼
- Gitflow
- maven
- 1.生命周期命令
- 聚合與繼承
- 插件管理
- assembly
- 資源管理插件
- 依賴范圍
- 分環境打包
- dependencyManagement
- 版本分類
- 找不到主類
- 無法加載主類
- 私服
- svn
- gradle
- 手動引入第三方jar包
- 打包exe文件
- Windows
- java
- 設計模式
- 七大原則
- 1.開閉原則
- 2. 里式替換原則
- 3. 依賴倒置原則
- 4. 單一職責原則
- 單例模式
- 工廠模式
- 簡單工廠
- 工廠方法模式
- 抽象工廠模式
- 觀察者模式
- 適配器模式
- 建造者模式
- 代理模式
- 適配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 規則
- 模板
- 合并單元格
- word
- 讀取
- java基礎
- 類路徑與jar
- 訪問控制權限
- 類加載
- 注解
- 異常處理
- String不可變
- 跨域
- transient關鍵字
- 二進制編碼
- 泛型1
- 與或非
- final詳解
- Java -jar
- 正則
- 讀取jar
- map
- map計算
- hashcode計算原理
- 枚舉
- 序列化
- URLClassLoader
- 環境變量和系統變量
- java高級
- java8
- 1.Lambda表達式和函數式接口
- 2.接口的默認方法和靜態方法
- 3.方法引用
- 4.重復注解
- 5.類型推斷
- 6.拓寬注解的應用場景
- java7-自動關閉資源機制
- 泛型
- stream
- 時區的正確理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的區別
- 多線程
- 概念
- 線程實現方法
- 守護線程
- 線程阻塞
- 筆試題
- 類加載
- FutureTask和Future
- 線程池
- 同步與異步
- 高效簡潔的代碼
- IO
- ThreadLocal
- IO
- NIO
- 圖片操作
- KeyTool生成證書
- 壓縮圖片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的資源路徑
- java開發規范
- jvm
- 高并發
- netty
- 多線程與多路復用
- 異步與事件驅動
- 五種IO模型
- copy on write
- code style
- 布隆過濾器
- 筆試
- 數據庫
- mybatis
- mybatis與springboot整合配置
- pagehelper
- 分頁數據重復問題
- Java與數據庫之間映射
- 攔截器
- 攔截器應用
- jvm
- 堆內存測試
- 線程棧
- 直接內存
- 內存結構
- 內存模型
- 垃圾回收
- 調優
- 符號引用
- 運行參數
- 方法區
- 分帶回收理論
- 快捷開發
- idea插件
- 注釋模板
- git
- pull沖突
- push沖突
- Excel處理
- 圖片處理
- 合并單元格
- easypoi
- 模板處理
- 響應式編程
- reactor
- reactor基礎
- jingyan
- 規范
- 數據庫