Java4Android之一切都是對象(1)
我們總是喜歡用C++和Java作為對比,雖然,這兩者我都用過卻又相忘於江湖。而我的第一份工作,卻讓我操著一口最為古老的語言(相對它兩)C。當然,從下載庫到Android的轉換,逼迫者自己重新回到麵向對象的世界。。。
1, 用引用操作對象。
在C/C++中,你可以直接操縱你的數據元素,也可以通過指針來簡介的操縱,當然,C++中還有引用,引用是一個數據元素的別名,它指向的是同一個地方(希望沒記錯)。
在Java中,一切都是對象,而對象的操縱卻是通過”引用(Reference)“。引用和對象的關係就像家裏的遙控和電視機的關係,沒有電視,遙控照樣存在,而要控製電視,需要通過遙控,當遙控沒有去控製的電視和它關聯,你去亂按,嘿嘿,不會出事,對,因為那是你家,但在Java,如果一個引用你沒有關聯對應的對象,你去操作它,向他發消息,是會出錯的,運行時錯誤(我隻是想提醒如我的菜鳥們一定要牢記編譯時錯誤和運行時錯誤)。
String s;//這樣的就是引用,還沒有關聯對象。 String s2="abc";//這個已經創建對象了 String s3=new String("efg");//和s2一樣,創建了對象,並且關聯了Reference
1)存儲到什麼地方
名稱 | 速度 | 說明 |
---|---|---|
寄存器(Register) | 最快 | 在CPU內部,速度最快,容量最小 |
堆棧(Stack) | 比寄存器慢,比堆快 | 位於RAM,通過堆棧指針可以從處理器那裏得 到直接支持。指針向下,分配內存,向上回收 內存,速度很快 |
堆(Heap) | 比Stack慢 | 位於RAM,一種通用的內存池,存放所有的Java 對象。好處就是靈活,缺點就是比Stack要慢 |
常量存儲區 (Const Value Storage) |
快 | 位於RAM也可以放到ROM都可以,個人認為會比 堆棧快,因為都是定死了,直接一個地址,省去分配, 回收 |
非RAM存儲 | 慢 | 一些流對象,持久化對象。可能是網絡,可能是磁盤, 所以速度是慢的 |
2)特例:基本類型
Java中依然保留了一些非對象的基本類型。如boolean ,char, byte, short, int, long, float, double, void。為什麼要保留這種內置類型?因為在Heap裏麵分配內存需要管理,這個時候如果一個int也搞一個對象,那麼內存碎片就會非常嚴重。所以,為了效率,Java選擇了妥協。即保留它們。
需要說明一下:(1)Java確定了基本類型的占的字節數,不會隨著平台而改變,這樣保持了非常好的移植性;(2)char是16位的,兩個字節,即是Unicode編碼。(3)所有數值類型都是有符號的,沒有什麼unsigned xxx,沒有。(4)每個基本類型都有它對應的包裝器,它們是類是對象。(5)高精度計算,Java提供了BigInteger和BigDecimal。
3)數組
和C++/C的數組不一樣,Java的數組是會進行邊界檢查的,犧牲下效率換來安全。還有,創建一個Java數組,其實是創建了一個引用數組,數組裏麵的每個元素都是一個引用,它遲早都是要指向真正的對象。而當還沒有指定的時候,它為null。當然,也可以創建存放基本數據類型的數組,這種若沒有初始化,就會被初始化為0.
3,永遠不需要銷毀對象
在C/C++和Java中,作用域(Scope)由花括號的位置決定。不過!在C/C++中將一個較大作用域的變量”隱藏“起來的做法,在Java中是不允許的。因為Java設計者覺得這樣會導致程序混亂。
{ int x = 12; { int x=96; } }上述代碼是在C/C++合法,在Java非法的。
在Java中,引用的作用域完成之後,它指向的對象並不一定就立馬回收的。你也不用擔心對象內存外泄。這些工作都交給垃圾回收器去做。
最後更新:2017-04-03 05:40:13