從C#到Java入門指引之二——類

來源:互聯網
上載者:User

首發:http://www.eoeandroid.com/thread-233275-1-1.html

eoe社區索引大集合:

http://www.eoeandroid.com/portal.php?mod=topic&topicid=5

android 翻頁捲曲效果(內含源碼)
http://www.eoeandroid.com/thread-232572-1-1.html

Android兩側推出導覽功能表的實現
http://www.eoeandroid.com/thread-232567-1-1.html

-----------------文章本文--------------------

對於一種物件導向語言來說,類是它的核心。這一講,我們就來說說Java的類吧。

忘掉struct,Java只有class
在C#中,我們常常把比較小的資料結構聲明成結構體(struct),這樣產生的對象會分配在堆棧上(注),屬於實值型別,傳遞時會複製對象。
在Java中,一切自訂的資料結構都是類(class),它們被分配在堆上,屬於參考型別,傳遞時僅傳遞引用。

我們可以畫一個表:

Java的枚舉和C#的不一樣。C#的枚舉是對整數類型(可以byte、short、int、long等等,char除外)的簡單封裝,而Java的枚舉是一個完整功能的類。

註:如果結構體是某個類的成員變數,那麼它還是會被分配在託管堆上。

存取修飾詞
哈哈,還是發現用表格最直觀

可以看出,C#中存取修飾詞的使用細節更繁瑣,但兩者實現的功能基本一致。
其中需要注意的區別是,對於類內部的成員,當預設存取修飾詞時,C#認為這是私人,而Java認為這是包內可訪問。就這一點,個人感覺像C#這樣把預設處理成私人更自然一些。

不一樣的關鍵字,不一樣的表示符號
既然是兩種語言嘛,總有些符號和關鍵字的的用法不怎麼一樣:

藏起來的virtual
Java的代碼裡似乎沒見過virtual吧?
的確是如此,因為Java認定所有方法預設就是virtual,與基類具有相同簽名的方法預設就是override
那不想做成虛方法怎麼辦?那就加上final關鍵字。

有時候,想override的時候,沒寫對方法的整個簽名,比如傳回型別明明是int寫成long了。這時候編譯器不會報錯,而是默默地產生了一個新的方法。
為了杜絕這種狀況,Java
5添加了@Override註解,用來標明重寫的方法。如果這個方法沒有正確重寫基類中的方法,編譯器會報一個錯。

public class SomeCollection{     @Override    public String toString(){         return super.toString();     } }

失落的運算子多載
這個C++都有的特性,Java居然沒有...我能不能吐槽...罷了,不加入運算子多載這個特性,也是有利有弊:
利:Java文法更簡單、易讀。
弊:Java語言的表達能力更弱,靈活性更差。比如C#重載了字串的==運算子,保證了語義上的一致性;C#中的列表和字典都是可以使用[]的,使代碼變得更直觀,而Java中只有數組才能這麼寫。

Java把這個特性砍掉,還是蠻可惜的。像字串的判等、列表的隨機訪問這些事兒在Java中只是稍微麻煩一些。但如果你嘗試在Java中封裝一個矩陣類,並使用它來實現某個演算法,我敢肯定你會為各種小括弧的嵌套而抓狂的。

既然不讓重載運算子,那麼字串之間為啥又可以用+連起來?
這個問題問得好!
真相是,你只要把不能加的對象用+連起來,編譯器會自動把它們給toString了,然後放到StringBuilder裡連上!

關於Object
在C#中,object是除指標外所有類型的基類;而在Java中,Object是除基本類型外所有類型的基類。
兩者的設計差不多,有這麼幾個公開的方法,可以一一對應。除了取得第一個,其他幾個方法都可以被重寫:

類內的初始化塊
剛從C#轉過來的同學可能會被類內部“莫名其妙”出現的大括弧給弄糊塗了,“這段代碼時幹神馬的呢”

public class SomeCollection{     private int[] mArray;           {         mArray = new int[10];         for(int i=0; i<10; i++){             mArray[ i] = i;         }     }           public SomeCollection{     } }

那是Java的初始化塊,它會在構造方法執行之前執行。
如果有一個欄位的初始化不能在=右邊用一句話搞定,並且所有構造方法都需要用的話,可以考慮提取出來弄成初始化塊。

另外,針對靜態欄位也有對應的靜態初始化塊,在前面的大括弧前加上“static”就行啦。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.