正如問題所述,當切換到Java時,C++程序員面臨的一些常見/主要問題是什麼?我正在尋找一些廣泛的主題名稱或示例以及工程師必須進行的日常調整。然後,我可以去做一個深入的閱讀。C++程序員有哪些常見的Java陷阱/陷阱?
我在誰已經在C++中工作多年,並曾與Java,但與其他任何指針工作,甚至建議書非常歡迎更多的工程師的意見特別感興趣。
正如問題所述,當切換到Java時,C++程序員面臨的一些常見/主要問題是什麼?我正在尋找一些廣泛的主題名稱或示例以及工程師必須進行的日常調整。然後,我可以去做一個深入的閱讀。C++程序員有哪些常見的Java陷阱/陷阱?
我在誰已經在C++中工作多年,並曾與Java,但與其他任何指針工作,甚至建議書非常歡迎更多的工程師的意見特別感興趣。
而是使用這種模式:
OutputStream os;
try {
os = ...
// do stuff
} finally {
try { os.close(); } catch (Exception e) { }
}
最終你會做的東西一樣不少。
習慣有垃圾收集器。不能依靠析構函數來清理GC不處理的資源。
一切都是按值傳遞的,因爲引用被傳遞,而不是對象。
沒有拷貝構造函數,除非你有一個需要克隆。沒有賦值運算符。
所有方法都是通過默認值,即C的相反++虛擬。在C++中的純虛類 -
接口的顯式語言支持。
Generics(而不是模板),特別是他們使用type erasure實現的方式。
我的最大的障礙,從C++到Java穿越被拋棄的程序代碼。我習慣於在程序中把我所有的東西捆綁在一起。沒有java中的程序代碼,我在任何地方都做了循環引用。我不得不學習如何從對象中調用對象,而不需要彼此依賴。這是最大的障礙,但最容易克服。
2號個人問題是文檔。 JavaDoc很有用,但是對於許多Java項目而言,都存在這樣的誤解,即所需的只是JavaDoc。我在C++項目中看到了更好的文檔。這可能只是代碼之外的文檔的個人偏好。
3。其實在指針在java中,只是沒有指針算術。在java中,他們被稱爲引用。不要以爲你可以忽略事情的指向,它會回來一大口。
==和.equals不相等。
==將查看指針(引用),而.equals將查看引用指向的值。
能你能解釋一下你可以在C++中使用的循環引用的類型,但不能在Java中使用嗎? – 2009-01-12 02:53:19
我會編輯澄清。我想說的是,當我第一次開始在java中編寫代碼時,我開始製作循環引用,因爲我無法在程序上編寫代碼。我認爲,至少由我認識的開發人員來看,這是一種糟糕的形式來製作循環引用。 – WolfmanDragon 2009-01-12 03:45:07
這是所有的小小的語法差異,讓我。缺乏析構函數。另一方面,能夠爲每個班(非常方便或測試)編寫一個主文本是非常好的;在習慣之後,可用於jar文件的結構和技巧真的很棒;語義完全定義的事實(例如,int在各處都是一樣的)真的很好。
既然你提到圖書的建議,一定要閱讀Effective Java, 2nd ed. - 它解決了我在回答中列出的大多數陷阱。
其次。這是一本很好的小書,用來回答你的問題(陷阱,陷阱和最佳實踐)。 – 2009-01-11 23:44:38
我讀過的Java「gotchas」的最好的書是Java Puzzlers: Traps, Pitfalls, and Corner Cases。這是而不是專門針對C++開發人員,但它充滿了你想要注意的事情的例子。
所有的方法都是虛擬的。
參數化類型(仿製藥)不實際創建代碼的特定參數的代碼(即List<String>
使用相同的字節碼List<Object>;
編譯器,如果你試圖把前一個Integer
是抱怨的唯一的事情)。
Varargs很簡單。
Plus:無法選擇按對象傳遞值。 – 2009-01-12 01:37:45
我最大的問題是始終牢記內存的所有權。在C++中,這是一個必須要做的事情,它在開發人員的腦海中創造出一些難以克服的模式。在Java中,我可以忽略它(無論如何,在很大程度上),這使得一些算法和方法在C++中會非常尷尬。
創建偶然的參考,當一個人想拷貝構造函數:
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?!?!? */
在Java中沒有對象,有對象只引用。例如:
MyClass myClass; // no object is created unlike C++.
但是:
MyClass myClass = new MyClass(); // Now it is a valid java object reference.
指定的方法參數作爲最終並不意味着你首先認爲這意味着
private void doSomething(final MyObject myObj){
...
myObj.setSomething("this will change the obj in the calling method too");
...
}
因爲Java是按值傳遞它做你在問什麼,除非你明白java是如何傳遞引用的值而不是對象的,否則不會立即明顯。
另一個值得注意的是關鍵字final
和const
。 Java將const定義爲一個保留關鍵字,但沒有詳細說明它的用法。此外
object1=object2
不會複製它改變了參考
通過引用傳遞的對象/值值得唸叨:http://www.yoda.arachsys.com/java/passing.html – Dolph 2010-02-25 01:13:04