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