2009-01-11 130 views
6

正如問題所述,當切換到Java時,C++程序員面臨的一些常見/主要問題是什麼?我正在尋找一些廣泛的主題名稱或示例以及工程師必須進行的日常調整。然後,我可以去做一個深入的閱讀。C++程序員有哪些常見的Java陷阱/陷阱?

我在誰已經在C++中工作多年,並曾與Java,但與其他任何指針工作,甚至建議書非常歡迎更多的工程師的意見特別感興趣。

回答

15
  • 在C++中,您可以使用析構函數來清理文件描述符,數據庫連接等。天真的等價物是使用終結器。別。永遠。

而是使用這種模式:

OutputStream os; 
try { 
    os = ... 
    // do stuff 
} finally { 
    try { os.close(); } catch (Exception e) { } 
} 

最終你會做的東西一樣不少。

  • 如果未指定訪問改性劑,Java中的成員是包私人默認,不像C++中,他們是私有的。包私有是一個惱人的訪問級別,這意味着它是私人的,但在同一包中的任何東西都可以訪問它(這是一個愚蠢的默認訪問級別imho);
  • 沒有堆棧/堆分離。所有東西都是在堆上創建的(好吧,這不是真的,但我們會假裝它是);
  • 沒有傳遞參考;
  • 函數指針的等價物是匿名接口。
+1

通過引用傳遞的對象/值值得唸叨:http://www.yoda.arachsys.com/java/passing.html – Dolph 2010-02-25 01:13:04

3

習慣有垃圾收集器。不能依靠析構函數來清理GC不處理的資源。

一切都是按值傳遞的,因爲引用被傳遞,而不是對象。

沒有拷貝構造函數,除非你有一個需要克隆。沒有賦值運算符。

所有方法都是通過默認值,即C的相反++虛擬。在C++中的純虛類 -

接口的顯式語言支持。

7

我的最大的障礙,從C++到Java穿越被拋棄的程序代碼。我習慣於在程序中把我所有的東西捆綁在一起。沒有java中的程序代碼,我在任何地方都做了循環引用。我不得不學習如何從對象中調用對象,而不需要彼此依賴。這是最大的障礙,但最容易克服。

2號個人問題是文檔。 JavaDoc很有用,但是對於許多Java項目而言,都存在這樣的誤解,即所需的只是JavaDoc。我在C++項目中看到了更好的文檔。這可能只是代碼之外的文檔的個人偏好。

3。其實在指針在java中,只是沒有指針算術。在java中,他們被稱爲引用。不要以爲你可以忽略事情的指向,它會回來一大口。

  • ==和.equals不相等。

  • ==將查看指針(引用),而.equals將查看引用指向的值。

+0

能你能解釋一下你可以在C++中使用的循環引用的類型,但不能在Java中使用嗎? – 2009-01-12 02:53:19

+0

我會編輯澄清。我想說的是,當我第一次開始在java中編寫代碼時,我開始製作循環引用,因爲我無法在程序上編寫代碼。我認爲,至少由我認識的開發人員來看,這是一種糟糕的形式來製作循環引用。 – WolfmanDragon 2009-01-12 03:45:07

2

這是所有的小小的語法差異,讓我。缺乏析構函數。另一方面,能夠爲每個班(非常方便或測試)編寫一個主文本是非常好的;在習慣之後,可用於jar文件的結構和技巧真的很棒;語義完全定義的事實(例如,int在各處都是一樣的)真的很好。

5

既然你提到圖書的建議,一定要閱讀Effective Java, 2nd ed. - 它解決了我在回答中列出的大多數陷阱。

+0

其次。這是一本很好的小書,用來回答你的問題(陷阱,陷阱和最佳實踐)。 – 2009-01-11 23:44:38

0

所有的方法都是虛擬的。

參數化類型(仿製藥)不實際創建代碼的特定參數的代碼(即List<String>使用相同的字節碼List<Object>;編譯器,如果你試圖把前一個Integer是抱怨的唯一的事情)。

Varargs很簡單。

4
  • 沒有多重繼承,每類隱式從java.lang.Object中(其中有許多重要的方法,你一定要了解和理解)派生
  • 您可以通過實現一種多重繼承接口
  • 沒有運算符重載,除了'+'(對於字符串),並且絕對沒有你可以自己做的
  • 沒有無符號數字類型,除char之外,它不應該被用作數字類型。如果你必須處理未簽名的類型,你必須進行大量的投射和掩蔽。
  • 字符串不是空終止的,而是它們基於char數組,因此是不可變的。因此,通過在循環中追加+ =來構建一個長字符串是O(n^2),所以不要這樣做;改用StringBuilder。
+0

Plus:無法選擇按對象傳遞值。 – 2009-01-12 01:37:45

2

我最大的問題是始終牢記內存的所有權。在C++中,這是一個必須要做的事情,它在開發人員的腦海中創造出一些難以克服的模式。在Java中,我可以忽略它(無論如何,在很大程度上),這使得一些算法和方法在C++中會非常尷尬。

5

創建偶然的參考,當一個人想拷貝構造函數:

myClass me = new myClass(); 
myClass somebodyElse = me; /* A reference, not a value copied into an independent instance! */ 
somebodyElse.setPhoneNumber(5551234); 
/* Hey... how come my phone doesn't work anymore?!?!? */ 
2

在Java中沒有對象,有對象只引用。例如:

MyClass myClass; // no object is created unlike C++. 

但是:

MyClass myClass = new MyClass(); // Now it is a valid java object reference. 
0

指定的方法參數作爲最終並不意味着你首先認爲這意味着

private void doSomething(final MyObject myObj){ 
    ... 
    myObj.setSomething("this will change the obj in the calling method too"); 
    ... 
} 

因爲Java是按值傳遞它做你在問什麼,除非你明白java是如何傳遞引用的值而不是對象的,否則不會立即明顯。

0

另一個值得注意的是關鍵字finalconst。 Java將const定義爲一個保留關鍵字,但沒有詳細說明它的用法。此外

object1=object2 

不會複製它改變了參考