閱讀535 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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


2,必須由你創建所有對象

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

  上一篇:go Java4Android之靜態相關
  下一篇:go 兩個activity或者activity和fragment傳值