java入門之計算機基礎知識
什麼是計算機?計算機在生活中的應用舉例
- 計算機(Computer)全稱:電子計算機,俗稱電腦。是一種能夠按照程式執行,自動、高速處理海量資料的現代化智慧電子裝置。由硬體和軟體所組成,沒有安裝任何軟體的計算機稱為裸機。常見的形式有臺式計算機、筆記本計算機、大型計算機等。
- 應用舉例
- 1:科學計算
- 2、資料處理
- 3、自動控制
- 4、計算機輔助設計
- 5、人工智慧
- 6、多媒體應用
- 7、計算機網路
- …
什麼是硬體?硬體舉例
- 計算機硬體(Computer Hardware)是指計算機系統中由電子,機械和光電元件等組成的各種物理裝置的總稱。這些物理裝置按系統結構的要求構成一個有機整體為計算機軟體執行提供物質基礎。
- 馮.諾依曼體系結構
-
計算機的硬體分成5大組成部件:運算器、控制器、儲存器、輸入裝置和輸出裝置。
- 運算器和控制器是計算機的核心,合稱中央處理單元(Central Processing Unit,CPU)或處理器。CPU的內部還有一些高速儲存單元,被稱為暫存器。其中運算器執行所有的算術和邏輯運算;控制器負責把指令逐條從儲存器中取出,經譯碼後向計算機發出各種控制命令;而暫存器為處理單元提供操作所需要的資料。
- 儲存器是計算機的記憶部分,用來存放程式以及程式中涉及的資料。它分為內部儲存器和外部儲存器。內部儲存器用於存放正在執行的程式和使用的資料,其成本高、容量小,但速度快。外部儲存器可用於長期儲存大量程式和資料,其成本低、容量大,但速度較慢。
- 輸入裝置和輸出裝置統稱為外部裝置,簡稱外設或I/O裝置,用來實現人機互動和機間通訊。微型機中常用的輸入裝置有鍵盤、滑鼠等,輸出裝置有顯示器、印表機等。
什麼是軟體?軟體分類及舉例
- 計算機軟體(Computer Software)是使用計算機過程中必不可少的東西,計算機軟體可以使計算機按照事先預定好的順序完成特定的功能
- 計算機軟體按照其功能劃分為系統軟體與應用軟體
- 系統軟體: DOS(Disk Operating System), Windows, Linux, Unix, Mac, Android, iOS
- 應用軟體:office QQ聊天 YY語言 掃雷
計算機基礎知識(軟體開發和計算機語言概述)
- A:什麼是軟體
- 按照特定順序組織的計算機資料和指令的集合
- B:什麼是開發
- 軟體的製作過程
- C:什麼是軟體開發
- 藉助開發工具與計算機語言製作軟體
- D:什麼是計算機語言
- 人與計算機之間進行資訊交流溝通的一種特殊語言
- E:計算機語言的分類
- 機器語言:
- 機器語言是直接用二進位制程式碼指令表達的計算機語言,指令是用0和1組成的一串程式碼,它們有一定的位數,並分成若干段,各段的編碼表示不同的含義。
- 組合語言:
- 組合語言是使用一些特殊的符號來代替機器語言的二進位制碼,計算機不能直接識別,需要用一種軟體將組合語言翻譯成機器語言。
- 高階語言:
- 使用普通英語進行編寫原始碼,通過編譯器將原始碼翻譯成計算機直接識別的機器語言,之後再由計算機執行。
- 高階語言包括C,C++,C#,JAVA
- 機器語言:
計算機基礎知識(常見的DOS命令講解)
- A:d: 回車 碟符切換
- B:dir(directory):列出當前目錄下的檔案以及資料夾
- C:cd (change directory)改變指定目錄(進入指定目錄)
- D:cd.. : 退回到上一級目錄
- E:cd: 退回到根目錄
- F:cls : (clear screen)清屏
- G:exit : 退出dos命令列(分割線上的需要掌握,下的瞭解)
- /=========================================================
- md (make directory) : 建立目錄
- rd (remove directory): 刪除目錄
- del (delete): 刪除檔案,刪除一堆字尾名一樣的檔案*.txt
- notepad 建立檔案
- 刪除帶內容的資料夾
- rd + /s 資料夾名稱(詢問是否刪除)
- rd + /q + /s 資料夾名稱(直接刪除)
Java語言基礎(Java語言概述)(瞭解)
- A:Java語言發展史
- 詹姆斯·高斯林(James Gosling)1977年獲得了加拿大卡爾加里大學電腦科學學士學位,1983年獲得了美國卡內基梅隆大學電腦科學博士學位,畢業後到IBM工作,設計IBM第一代工作站NeWS系統,但不受重視。後來轉至Sun公司,1990年,與Patrick,Naughton和Mike Sheridan等人合作“綠色計劃”,後來發展一套語言叫做“Oak”,後改名為Java。
- SUN(Stanford University Network,斯坦福大學網路公司)
- B:Java語言版本
- JDK 1.1.4 Sparkler 寶石 1997-09-12
- JDK 1.1.5 Pumpkin 南瓜 1997-12-13
- JDK 1.1.6 Abigail 阿比蓋爾–女子名 1998-04-24
- JDK 1.1.7 Brutus 布魯圖–古羅馬政治家和將軍 1998-09-28
- JDK 1.1.8 Chelsea 切爾西–城市名 1999-04-08
- J2SE 1.2 Playground 運動場 1998-12-04
- J2SE 1.2.1 none 無 1999-03-30
- J2SE 1.2.2 Cricket 蟋蟀 1999-07-08
- J2SE 1.3 Kestrel 美洲紅隼(sǔn) 2000-05-08
- J2SE 1.3.1 Ladybird 瓢蟲 2001-05-17
- J2SE 1.4.0 Merlin 灰背隼 2002-02-13
- J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16
- J2SE 1.4.2 Mantis 螳螂 2003-06-26
- JAVASE 5.0 (1.5.0) Tiger 老虎
- JAVASE 5.1 (1.5.1) Dragonfly 蜻蜓
- JAVASE 6.0 (1.6.0) Mustang 野馬
- JAVASE 7.0 (1.7.0) Dolphin 海豚
- C:Java語言平臺
- J2SE(Java 2 Platform Standard Edition)標準版
- 是為開發普通桌面和商務應用程式提供的解決方案,該技術體系是其他兩者的基礎,可以完成一些桌面應用程式的開發
- J2ME(Java 2 Platform Micro Edition)小型版
- 是為開發電子消費產品和嵌入式裝置提供的解決方案
- J2EE(Java 2 Platform Enterprise Edition)企業版
- 是為開發企業環境下的應用程式提供的一套解決方案,該技術體系中包含的技術如 Servlet、Jsp等,主要針對於Web應用程式開發
- J2SE(Java 2 Platform Standard Edition)標準版
- D:Java語言特點
- 簡單性
- 解釋性
- 面向物件
- 高效能
- 分散式處理
- 多執行緒
- 健壯性
- 動態
- 結構中立
- 安全性
- 開源
- 跨平臺
Java語言基礎(Java語言跨平臺原理)(掌握)
- A:什麼是跨平臺性
- B:Java語言跨平臺原理
- 只要在需要執行java應用程式的作業系統上,先安裝一個Java虛擬機器(JVM Java Virtual Machine)即可。由JVM來負責Java程式在該系統中的執行。
- C:Java語言跨平臺圖解
- write once ,run anywhere!(一處編譯,到處執行)
Java語言基礎(JRE和JDK的概述)(掌握)
- A:什麼是JRE
- 包括Java虛擬機器(JVM Java Virtual Machine)和Java程式所需的核心類庫等,如果想要執行一個開發好的Java程式,計算機中只需要安裝JRE即可。
- JRE:JVM+類庫。
- B:什麼是JDK
- JDK是提供給Java開發人員使用的,其中包含了java的開發工具,也包括了JRE。所以安裝了JDK,就不用在單獨安裝JRE了。
- 其中的開發工具:編譯工具(javac.exe) 打包工具(jar.exe)等
- JDK:JRE+JAVA的開發工具。
- C:為什麼JDK中包含一個JRE
- 為什麼JDK中包含一個JRE呢?
- 開發完的程式,需要執行一下看看效果。
- 為什麼JDK中包含一個JRE呢?
- D:JDK,JRE,JVM的作用和關係
Java語言基礎(JDK的下載和安裝過程圖解)(瞭解)
- A:JDK的下載
- a:官網 http://www.oracle.com
- b:演示下載流程
- B:JDK的安裝
- a:傻瓜式安裝
- 雙擊安裝程式,然後一路next即可(但是不建議)
- b:安裝的推薦方式
- 安裝路徑不要有中文或者特殊符號如空格等。
- 所有和開發相關的軟體最好安裝目錄統一。
- 舉例:我的JDK安裝路徑
- D:\xuexi\JDK
- 舉例:我的JDK安裝路徑
- 當提示安裝JRE時,可以選擇不安裝。建議還是安裝上。
- c:演示安裝流程
- 可以先在d盤建立一個資料夾(develop)
- 然後演示安裝過程
- a:傻瓜式安裝
- C:驗證安裝是否成功
- a:通過DOS命令,切換到JDK安裝的bin目錄下。
- D:\xuexi\JDK\bin
- b:然後分別輸入javac和java,如果正常顯示一些內容,說明安裝成功
- a:通過DOS命令,切換到JDK安裝的bin目錄下。
Java語言基礎(JDK安裝路徑下的目錄解釋)
- a:bin目錄:該目錄用於存放一些可執行程式。
- 如javac.exe(java編譯器)、java.exe(java執行工具),jar.exe(打包工具)和* javadoc.exe(文件生成工具)等。
- b:db目錄:db目錄是一個小型的資料庫。
- 從JDK 6.0開始,Java中引用了一個新的成員JavaDB,這是一個純Java實現、開源的資料庫管理系統。這個資料庫不僅輕便,而且支援JDBC 4.0所有的規範,在學習JDBC 時,不再需要額外地安裝一個數據庫軟體,選擇直接使用JavaDB即可。
- c:jre目錄:”jre”是 Java Runtime Environment 的縮寫,意為Java程式執行時環境。此目錄是Java執行時環境的根目錄,它包括Java虛擬機器,執行時的類包,Java應用啟動器以及一個bin目錄,但不包含開發環境中的開發工具。
- d:include目錄:由於JDK是通過C和C++實現的,因此在啟動時需要引入一些C語言的標頭檔案,該目錄就是用於存放這些標頭檔案的。
- e:lib目錄:lib是library的縮寫,意為 Java 類庫或庫檔案,是開發工具使用的歸檔包檔案。
- f:src.zip檔案:src.zip為src資料夾的壓縮檔案,src中放置的是JDK核心類的原始碼,通過該檔案可以檢視Java基礎類的原始碼。
ava語言基礎(Java開發工具介紹)
- A:notepad(微軟作業系統自帶)
- B:Editplus/Notepad++
- C:Eclipse
- D:MyEclipse
- E:idea
Java概述
基本組成
- JDK:Java Development Kit,java的開發和執行環境,java的開發工具和 jre。
- JRE:Java Runtime Environment,java 程式的執行環境,java 執行的所需的類庫+JVM。
- JVM:Java Virtual Machine,是一個虛構出來的計算機,能夠遮蔽了與具體平臺相關的資訊,編譯生成在Java虛擬機器上執行的目的碼(位元組碼)。Java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。這就是Java的能夠“一次編譯,到處執行”的原因。
- 配置環境變數:使jdk\bin目錄下的工具,可以在任意目錄下允許,原因是,將所在目錄告訴了系統,當使用該工具時,由系統幫我們去找指定的目錄
新建系統變數JAVA_HOME 和CLASSPATH
變數名:JAVA_HOME
變數值:C:\Program Files\Java\jdk1.7.0
變數名:CLASSPATH
變數值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
變數名:Path
變數值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASSPATH
javac編譯器的一個環境變數。它的作用與 import、package關鍵字有關。編譯器面對 import關鍵字時,就知道要引入 package中的類;但是首先得告訴編譯器這個package的所在位置;如何告訴它呢?就是設定 CLASSPATH 啦 :) 如果 java.util 這個 package 在 c:/jdk/ 目錄下,你得把 c:/jdk/這個路徑設定到 CLASSPATH中去!當編譯器面對 importjava.util.*這個語句時,它先會查詢 CLASSPATH所指定的目錄,並檢視子目錄 java/util是否存在,然後找出名稱吻合的已編譯檔案(.class 檔案)。如果沒有找到就會報錯!
PATH環境變數
PATH環境變數。作用是指定命令搜尋路徑,在命令列下面執行命令如 javac編譯 java程式時,它會到 PATH變數所指定的路徑中查詢看是否能找到相應的命令程式。我們需要把 jdk安裝目錄下的 bin 目錄增加到現有的PATH 變 量中 , bin 目錄 中包 含經常要用到的可執行檔案 javac/java/javadoc等待,設定好 PATH變數後,就可以在任何目錄下執行 javac/java等工具了。
javac命令和 java命令
要知道 java是分兩部分的:一個是編譯,一個是執行。
javac:負責的是編譯的部分,當執行 javac 時,會啟動 java 的編譯器程式。對指定副檔名的.java檔案進行編譯。 生成了 jvm可以識別的位元組碼檔案。也就是 class檔案,也就是 java的執行程式。
java:負責執行的部分.會啟動 jvm.載入執行時所需的類庫,並對 class檔案進行執行.一個檔案要被執行,必須要有一個執行的起始點,這個起始點就是 main函式.
Java基本語法
變數
變數命名
- 首字母:字母、下劃線“_”、“$”
- 其餘部分:數字、字母、字母、下劃線“_”、“$”
- 命名規則:見文知義、駝峰命名法
Java語言基礎(關鍵字的概述和使用)
- A:什麼是關鍵字
- 被Java語言賦予特定含義的單詞
- B:關鍵字的特點
- 組成關鍵字的字母全部小寫
- C:常見關鍵字
- public static void class等
- D:關鍵字的注意事項
- goto和const作為保留字存在,目前並不使用,類似Editplus這樣的高階記事本,針對關鍵字有特殊的顏色標記,非常直觀
Java語言基礎(識別符號的概述和組成規則)
- A:什麼是識別符號
- 就是給類,介面,方法,變數等起名字時使用的字元序列
- B:識別符號的組成規則
- 英文大小寫字母
- 數字字元
- $和_
- C:識別符號注意事項
- 1,不能使用關鍵字
- 2,不能數字開頭
Java語言基礎(識別符號中常見的命名規則)
- 見名知意
- A:包
- 最好是域名倒過來,要求所有的字母小寫
- B:類或者介面
- 如果是一個單詞首字母大寫
- 如果是多個單詞每個單詞首字母大寫(駝峰標識)
- C:方法或者變數
- 如果是一個單詞全部小寫
- 如果是多個單詞,從第二個單詞首字母大寫
- D:常量
- 如果是一個單詞,所有字母大寫
- 如果是多個單詞,所有的單詞大寫,用下劃線區分每個單詞
變數的作用域及生命週期
- 變數的作用域:
作用域從變數定義的位置開始,到該變數所在的那對大括號結束;
2. 生命週期:
變數從定義的位置開始就在記憶體中活了;
變數到達它所在的作用域的時候就在記憶體中消失了。
Java 記憶體管理
概述
對於 Java程式設計師來說,在虛擬機器的自動記憶體管理機制的幫助下,不再需要為每一個 new操作去寫配對的 delete/free程式碼,而且不容易出現記憶體洩漏和記憶體溢位問題,看起來由虛擬機器管理記憶體一切都很美好。不過,也正是因為 Java程式設計師把記憶體控制的權力交給了 Java虛擬機器,一旦出現記憶體洩漏和溢位方面的問題,如果不瞭解虛擬機器是怎樣使用記憶體的,那排查錯誤將會成為一項異常艱難的工作。
執行時資料區域
Java虛擬機器在執行 Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,以及建立和銷燬的時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則是依賴使用者執行緒的啟動和結束而建立和銷燬。Java虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域
程式計數器
程式計數器(Program Counter Register)是一塊較小的記憶體空間,它的作用可以看做是當前執行緒所執行的位元組碼的行號指示器。在虛擬機器的概念模型裡,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。 由於 Java 虛擬機器的多執行緒是通過執行緒輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個核心)只會執行一條執行緒中的指令。因此,為了執行緒切換後能恢復到正確的執行位置,每條執行緒都需要有一個獨立的程式計數器,各條執行緒之間的計數器互不影響,獨立儲存,我們稱這類記憶體區域為“執行緒私有”的記憶體。 如果執行緒正在執行的是一個 Java 方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址;如果正在執行的是 Natvie 方法,這個計數器值則為空(Undefined)。此記憶體區域是唯一一個在 Java 虛擬機器規範中沒有規定任何 OutOfMemoryError 情況的區域。
Java虛擬機器棧
與程式計數器一樣,Java 虛擬機器棧(Java Virtual Machine Stacks)也是執行緒私有的,它的生命週期與執行緒相同。虛擬機器棧描述的是 Java 方法執行的記憶體模型:每個方法被執行的時候都會同時建立一個棧幀(StackFrame)用於儲存區域性變量表、操作棧、動態連結、方法出口等資訊。每一個方法被呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。經常有人把 Java 記憶體區分為堆記憶體(Heap)和棧記憶體(Stack),與物件記憶體分配關係最密切的記憶體區域是這兩塊。所指的“棧”就是現在講的虛擬機器棧,或者說是虛擬機器棧中的區域性變量表部分。區域性變量表存放了編譯期可知的各種基本資料型別(boolean、byte、char、short、int、float、long、double)、物件引用(reference 型別),它不等同於物件本身,根據不同的虛擬機器實現,它可能是一個指向物件起始地址的引用指標,也可能指向一個代表物件的控制代碼或者其他與此物件相關的位置。其中 64 位長度的 long 和 double 型別的資料會佔用 2 個區域性變數空間(Slot),其餘的資料型別只佔用 1 個。區域性變量表所需的記憶體空間在編譯期間完成分配,當進入一個方法時,這個方法需要在幀中分配多大的區域性變數空間是完全確定的,在方法執行期間不會改變區域性變量表的大小。 在 Java 虛擬機器規範中,對這個區域規定了兩種異常狀況:如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲 StackOverflowError 異常;如果虛擬機器棧可以動態擴充套件(當前大部分的 Java 虛擬機器都可動態擴充套件,只不過 Java 虛擬機器規範中也允許固定長度的虛擬機器棧),當擴充套件時無法申請到足夠的記憶體時會拋OutOfMemoryError 異常。
本地方法棧
本地方法棧(Native Method Stacks)與虛擬機器棧所發揮的作用是非常相似的,其區別不過是虛擬機器棧為虛擬機器執行 Java 方法(也就是位元組碼)服務,而本地方法棧則是為虛擬機器使用到的 Native 方法服務。虛擬機器規範中對本地方法棧中的方法使用的語言、使用方式與資料結構並沒有強制規定,因此具體的虛擬機器可以自由實現它。甚至有的虛擬機器(譬如 Sun HotSpot 虛擬機器)直接就把本地方法棧和虛擬機器棧合二為一。與虛擬機器棧一樣,本地方法棧區域也會丟擲 StackOverflowError 和 OutOfMemoryError 異常。
Java堆
對於大多數應用來說,Java 堆(Java Heap)是 Java 虛擬機器所管理的記憶體中最大的一塊。Java 堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動時建立。此記憶體區域的唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。這一點在 Java 虛擬機器規範中的描述是:所有的物件例項以及陣列都要在堆上分配,所有的物件都分配在堆上也漸漸變得不是那麼“絕對”了。java 堆是垃圾收集器管理的主要區域,因此很多時候也被稱做“GC 堆”(Garbage Collected Heap)。儲存的是物件例項,,Java 堆可以處於物理上不連續的記憶體空間中,只要邏輯上是連續的即可,就像我們的磁碟空間一樣。在實現時,既可以實現成固定大小的,也可以是可擴充套件的,不過當前主流的虛擬機器都是按照可擴充套件來實現的。如果在堆中沒有記憶體完成例項分配,並且堆也無法再擴充套件時,將會丟擲 OutOfMemoryError 異常。
方法區
方法區(Method Area)與 Java 堆一樣,是各個執行緒共享的記憶體區域,它用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。雖然 Java 虛擬機器規範把方法區描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的應該是與 Java 堆區分開來。
Java 虛擬機器規範對這個區域的限制非常寬鬆,除了和 Java 堆一樣不需要連續的記憶體和可以選擇固定大小或者可擴充套件外,還可以選擇不實現垃圾收集。相對而言,垃圾收集行為在這個區域是比較少出現的,但並非資料進入了方法區就如永久代的名字一樣“永久”存在了。這個區域的記憶體回收目標主要是針對常量池的回收和對型別的解除安裝,一般來說這個區域的回收“成績”比較難以令人滿意,尤其是型別的解除安裝,條件相當苛刻,但是這部分割槽域的回收確實是有必要的。當方法區無法滿足記憶體分配需求時,將丟擲 OutOfMemoryError 異常。
執行時常量池
執行時常量池(Runtime Constant Pool)是方法區的一部分。Class 檔案中除了有類的版本、欄位、方法、介面等描述等資訊外,還有一項資訊是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後存放到方法區的執行時常量池中。 Java 虛擬機器對 Class 檔案的每一部分(自然也包括常量池)的格式都有嚴格的規定,每一個位元組用於儲存哪種資料都必須符合規範上的要求,這樣才會被虛擬機器認可、裝載和執行。但對於執行時常量池,Java 虛擬機器規範沒有做任何細節的要求,不同的提供商實現的虛擬機器可以按照自己的需要來實現這個記憶體區域。不過,一般來說,除了儲存 Class 檔案中描述的符號引用外,還會把翻譯出來的直接引用也儲存在執行時常量池中。 執行時常量池相對於 Class 檔案常量池的另外一個重要特徵是具備動態性,Java 語言並不要求常量一定只能在編譯期產生,也就是並非預置入 Class檔案中常量池的內容才能進入方法區執行時常量池,執行期間也可能將新的常量放入池中,這種特性被開發人員利用得比較多的便是 String 類的 intern()方法。 既然執行時常量池是方法區的一部分,自然會受到方法區記憶體的限制,當常量池無法再申請到記憶體時會丟擲 OutOfMemoryError 異常。
物件訪問
介紹完 Java 虛擬機器的執行時資料區之後,我們就可以來探討一個問題:在 Java 語言中,物件訪問是如何進行的?物件訪問在 Java 語言中無處不在,是最普通的程式行為,但即使是最簡單的訪問,也會卻涉及 Java棧、Java 堆、方法區這三個最重要記憶體區域之間的關聯關係,如下面的這句程式碼:
Object obj = new Object();
假設這句程式碼出現在方法體中,那“Object obj”這部分的語義將會反映到 Java 棧的本地變量表中,作為一個reference 型別資料出現。而“new Object()”這部分的語義將會反映到 Java 堆中,形成一塊儲存了 Object型別所有例項資料值(Instance Data,物件中各個例項欄位的資料)的結構化記憶體,根據具體型別以及虛擬機器實現的物件記憶體佈局(Object Memory Layout)的不同,這塊記憶體的長度是不固定的。另外,在 Java 堆中還必須包含能查詢到此物件型別資料(如物件型別、父類、實現的介面、方法等)的地址資訊,這些型別資料則儲存在方法區中。由於 reference型別在 Java虛擬機器規範裡面只規定了一個指向物件的引用,並沒有定義這個引用應該通過哪種方式去定位,以及訪問到 Java 堆中的物件的具體位置,因此不同虛擬機器實現的物件訪問方式會有所不同,主流的訪問方式有兩種:使用控制代碼和直接指標。 如果使用控制代碼訪問方式,Java 堆中將會劃分出一塊記憶體來作為控制代碼池,reference 中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件例項資料和型別資料各自的具體地址資訊如果使用的是直接指標訪問方式,Java 堆物件的佈局中就必須考慮如何放置訪問型別資料的相關資訊,reference 這兩種物件的訪問方式各有優勢,使用控制代碼訪問方式的最大好處就是 reference 中儲存的是穩定的控制代碼地址,在物件被移動(垃圾收集時移動物件是非常普遍的行為)時只會改變控制代碼中的例項資料指標,而 reference本身不需要被修改。使用直接指標訪問方式的最大好處就是速度更快,它節省了一次指標定位的時間開銷,由於物件的訪問在 Java 中非常頻繁,因此這類開銷積少成多後也是一項非常可觀的執行成本。就本書討論的主要虛擬機器 Sun HotSpot 而言,它是使用第二種方式進行物件訪問的,但從整個軟體開發的範圍來看,各種語言和框架使用控制代碼來訪問的情況也十分常見。
參考部落格:https://blog.csdn.net/echo_1994/article/details/78666868