- 句柄與對象
- 類比句柄為遙控器,對象為電視機
- 只有句柄,句柄它可以單獨存在:
String s;//這時候向s發送消息會報錯,因為沒有對應的對象給它操作
- 所以在建立句柄的時候需要初始化,對String來說 = <字符串>就足夠初始化。
- 但是需要general化:
String s = new String("<字符串>");
- 對象的保存
- 寄存器:編譯器決定
- 堆棧: 在RAM,依靠Stack指針,向下移開辟新內存,向上移回收內存。注意:因為堆棧底是在高位地址上的,這里上下就好理解了。創建程序時,編譯器需知道棧內所有成員的長度和生存時間,否則無法生成上下移動stack指針的指令。一般,句柄在stack里
- 堆:在RAM,又叫內存池。java編譯器不需要知道堆成員需要分配的存儲空間與生存時間。——堆保存更有靈活性,但是犧牲了性能。
- 靜態存儲區static:在RAM的固定位置,程序運行期隨時準備被使用。對象不能存在靜態存儲區,只能存一個對象指定的靜態元素。
- 常數存儲:置于代碼內部,可存于ROM區(只讀區)
- 非RAM存儲
- 基本類型/主要類型
- 參考:http://www.cnblogs.com/xiohao/p/4296059.html
- int a= 3; long b = 255L;的形式來定義的,稱為自動變量。句柄和實際對象都在棧里。
- 特例:String和堆,常量池:http://blog.csdn.net/otengyue/article/details/40745871
*數組
- C++最好不要用數組而是用STL庫里的容器。
- JAVA實際上棧上是一個句柄數組,數組成員時一個個句柄,句柄沒有初始化就在棧內存上標記為null。
- 作用域scope:
- JAVA不允許子scope里有同名句柄的建立,C++允許
//error { int x = 20; { int x = 10; } }
- 作用域的終點:句柄消失,但是其指向的內存空間還在。C++需要手動回收,以免內存溢出,JAVA有GC幫助回收那些不會再被引用的空間。
- JAVA一個基本類型,如果是類成員變量/字段則有默認值,保證有初始化,C++沒有。
``
Boolean false
Char '\u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
``
- JAVA一個基本類型,如果是局部變量,沒有初始化,會賦給隨機值而不是0,C++也是這樣
- 方法
- 調用方法就是給對象發送消息
- 除了基本類型,參數傳遞的實際是類型正確的句柄
- 一個程序就是一系列對象的集合,他們的方法將其他對象做自變量參數,并把消息發送給這些對象。
- 名字控制
- 不同模塊相同名稱,如何區分?
C++的類:
采用類嵌套的方式區分
對于全局變量,采用命名空間
JAVA類:
給庫一個獨立名稱:反轉域名,點號相當于子目錄
- Static靜態變量和方法
- 一旦將類方法或者變量設定為Static,他們將不會與任何實例對象產生聯系,未創造類的對象也能調用。
舉例:
class StaticBar(){ Static int i = 10; } StaticBar t1 = new StaticBar(); StaticBar t2 = new StaticBar();
兩個對象,他們只占據共有的一個Staticbar.i空間,任何對象.i操作都是對共有static變量操作。
- JAVA程序
- 程序開頭 放置import語句。每個java文件會自動導入一個類庫:java.lang
- Coding Style: 駝峰
類: 大寫字母開頭。變量和方法都是小寫開頭