數組 數組也是類的對象
具有相同類型和維數的數組屬於同一個類(不管長度只看維數)
數組的長度屬於對象實例
多維數組也是一維數組
如二
維數組
即為一個一維數組
該一維數組的每個元素是一個數組的引用
數組和普通對象一樣也存儲在堆中
數組名為數組的引用
通過索引即數組標號來訪問數組內容
異常 在java棧幀的幀數據區內保存有針對該方法的異常表的引用
異常表記載了該方法的字節碼(*
class)受catch子句保護的范圍(即try子句裡的
字節碼)
當某個方法拋出異常時
虛擬機在對應的異常表中尋找匹配的catch子句
並將控制權交給catch子句中的代碼
java執行引擎 實現平台無關性
以java方法幀裡的操作數棧為中心
將局部變量數組當作cpu的寄存器
每操作一個數據都要壓人操作數棧
然後返回至局部
變量區
java虛擬機規定強類型轉換
即低精度可以隱式轉換到高精度
高精度必須強制轉換到低精度
線程 線程即存在於進程中的某個執行體
每個線程必須遵守對象鎖定
線程等待和通知
對象鎖定使線程互斥的訪問對象資源
等待和通知則是遵守線程合理調度以達到同一個目的
java對象通過指令集達到上鎖目的
同過繼承
object類的wait()
notify()
notifyall()方法來等待和通知
當某個線程調用某個對象的wait()方法時
該線程被阻塞
並加入到該對象的線
程阻塞隊列中
直到另一個線程調用同一對象的通知方法
才能喚醒阻塞隊列中的線程
常量池 常量池用來存放類型的各種信息
包括類型的各種直接常量
和對其他類型
字段
方法的符號引用
常量池分為兩種
存儲在
class字節碼中的常量池和存儲在方法區中的運行時常量池
常量池以入口形式(類似於中斷向量表)出現
每個入口都指向一個表
表中存儲常量的信息
但從常量池的入口的標志位就可以判斷對應的表
中存儲的常量類型
常量池入口以一個標志位開始
該標志位指示該常量的類型
每個入口對應一個表
該表以符號_info結尾
表中存放常量的壓縮形式
常量池除了存放直接常量外還容納如下幾種符號引用
類和接口的全限定名
字段名稱和描述符(該描述符是一個指示字段類型的字符串
字段是一個類或接口的類變量或實例變量)
方法名稱和描述符(該描述符指示方法返回類型
參數類型
數量
順序)
運行時
虛擬機用常量池的全限定名和方法
字段的描述符來建立類與類的關系
常量池僅僅是一個引用和描述符的集合
並不接受任何賦值操作
所有對象的創建
方法和類變量的調用均要從常量池中獲取信息
但實例變量的調用從堆裡獲得
(猜想)
符號引用是由虛擬機解析後得到具體的地址來使用
常量池解析就是將常量池中的符號引用替換成直接引用
當要使用某個類的方法或字段時
首先從常量池中找到該方法或字段的符號引用
然後進行解析
找到其物理地址
把代碼中出現的各種符號引用
類與類的聯系
進行常量池解析
叫做動態連接
常量池結構 常量池由很多狠多的單元組成
每一個單元都形如(入口|內容)
訪問常量池單元時通過索引找到入口
然後訪問其內容
但有時單元的內容也
可能是一個常量池入口(比如類或接口的常量池單元
入口包含該類的符號引用即constant_class_info
而內容則指向一個
constant_utf
_info的常量池單元
該單元裡存放了該類的全限定名)
而直接常量如int
float等
內容處就是常量的值
方法區的結構 方法區存儲所有關於類型
接口的信息
方法區包含
常量池
存儲類型的直接常量和所有的字段
方法
其他類型的符號引用(僅僅是引用
並不存放具體信息)
字段信息
所有聲明的字段(包括字段名
類型
修飾符)
方法信息
所有定義的方法(包括方法名
返回類型
修飾符
方法的字節碼
方法棧幀的大小
方法的異常)
類變量信息
虛擬機在方法區中為所有類變量分配空間
以後的初始化
賦值等操作也在方法區中進行
以便為所有類實例共享
為提高訪問速度
虛擬機在方法區中為每個非抽象類設置了一個方法表
該表是一個數組
每個元素是一個方法的直接引用
當類的對象調用
方法時
就在方法表中搜索(抽象類沒有實例
所以不用調用方法
所以沒有方法表)
堆 堆存放類的實例和數組(包括實例變量
指向對應方法區中類數據的引用)
一個例子 class test{
public static void main(string args[])
{
string a=new string(
hello
)
string b=new string(
hello
)
string c=
hello
string d=
hello
}
}
則a==b返回false
c==d返回ture
因為
==比較雙方是否是同一個對象
首先
string a=new string(
hello
)
string b=new string(
hello
)
a和b分別各自新建了hello的對象和引用變量
即在堆中有兩個hello
他們各自的引用是a和b
而
string c=
hello
string d=
hello
先建立一個字符串類實例hello
再建立兩個字符串引用變量c和d
然後讓c和d都指向開始建立的hello實例
因此c和d指向的是同一個對象
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26064.html