CodeGym /Java Blog /Toto sisi /卡著了?學習 Java 最困難的部分以及如何克服它們
John Squirrels
等級 41
San Francisco

卡著了?學習 Java 最困難的部分以及如何克服它們

在 Toto sisi 群組發布
如您所知,我們建議編碼初學者從使用 Java 開始學習編程語言,而 CodeGym 擁有使學習 Java 的過程即使對於最沒有準備的學生也易於理解的一切。但是,儘管遊戲化元素、輕鬆的故事和有趣的角色有助於簡化這一過程,但對於大多數新學習者來說,全面學習 Java 的基礎知識很少會遇到挑戰。 卡著了? 學習 Java 最困難的部分以及如何克服它們 - 1今天,我們將看看 Java 編程基礎中一些最難的領域,試圖了解為什麼許多人覺得它們很困難,以及您是否可以做些什麼。

1.泛型

Java 中的泛型是具有參數的類型。創建泛型類型時,您不僅要指定類型,還要指定它將使用的數據類型。Java 學習者經常提到泛型是 Java 中最難理解的部分之一。“我的主要問題仍然是處理泛型。當你有方法要遵循參數時,這會容易得多,但當你必須編寫自己的方法時就會感到困惑,”一位匿名 Java 學習者說。

提示和建議

以下是經驗豐富的程序員和大學教授 Ravi Reddy 對 Java 泛型的看法:“Java 泛型做了一件 C++ 模板不做的事情——實現類型安全。C++ 模板的實現是一個簡單的預處理器技巧,並不能確保類型安全。Java 中的泛型類似於 C++ 模板,但具有額外的類型安全性。恕我直言,類型安全是任何良好開發環境的基本特徵。是的!由於我們在參數和類型之間的心理轉換,它們可能會令人困惑。但我相信花時間掌握它們是值得的。因為一旦我理解了接口和泛型,我發現自己在 Java 中“思考”得更好。”

2.多線程

Java 中的多線程是並發執行兩個或多個線程以實現應用程序對 CPU 的最大利用率的過程。多線程解決了非常重要的任務,可以讓我們的程序更快。通常快很多倍。但它被認為是許多 Java 新手容易卡住的主題之一。這一切都是因為多線程也會產生問題而不是解決問題。多線程可以產生兩個特定的問題:死鎖和競爭條件。死鎖是多個線程都在等待彼此佔有的資源,沒有一個可以繼續運行的情況。競爭條件是多線程系統或應用程序中的設計錯誤,其中系統或應用程序的操作取決於部分代碼的執行順序。

提示和建議

這裡有一個很好的推薦關於如何處理多線程,S.Lott 是一名軟件架構師,也是熱門問答網站 StackExchange 的活躍用戶:“多線程很簡單。編寫多線程應用程序非常非常容易。有一個簡單的技巧,那就是使用精心設計的消息隊列(不要自己動手)在線程之間傳遞數據。困難的部分是嘗試讓多個線程以某種方式神奇地更新共享對象。那是它容易出錯的時候,因為人們不注意存在的競爭條件。許多人不使用消息隊列並嘗試更新共享對象並給自己製造問題。變得困難的是設計一種在多個隊列之間傳遞數據時運行良好的算法。那很難。

3.類路徑問題

類路徑錯誤也被認為是 Java 開發人員在日常工作中面臨的抱怨最多的問題之一。“類路徑問題調試起來可能很耗時,而且往往發生在最糟糕的時間和地點:發布之前,而且通常在開發團隊幾乎無法訪問的環境中。它們也可能發生在 IDE 級別,並成為降低生產力的根源,”經驗豐富的 Java/Javascript 開發人員和編程相關教程的作者 Vasco Ferreira說。

提示和建議

“類路徑問題並不像乍看起來那樣低級或難以解決。這一切都是關於 zip 文件(罐子)在某些目錄中存在/不存在,如何找到這些目錄,以及如何在訪問受限的環境中調試類路徑。通過了解一組有限的概念,例如類加載器、類加載器鍊和先父/後父模式,可以有效地解決這些問題,”專家解釋道。

4.多態與正確使用

談到OOP的原理,很多人都說他們很難理解多態性。多態性是程序以相同方式處理具有相同接口的對象的能力,而無需有關對象特定類型的信息。儘管多態性是一個相當基礎的主題,但它的範圍相當廣泛,構成了 Java 基礎的重要組成部分。對於很多同學來說,多態是學習Java的第一個難點。這一切都是因為在不同的上下文中使用了不同形式的多態性,這可能會造成混淆。

提示和建議

除了學習之外,沒有其他方法可以處理多態性。以下是在哥本哈根大學教授編程的 Torben Mogensen 是如何解釋的這個概念:“簡單重載:+ 可以表示整數加法、浮點加法和(在某些語言中)字符串連接。子類型多態性:如果 B 是(繼承自)A 的子類型,則類型 B 的任何值都可以在需要類型 A 值的上下文中使用。參數多態性:類型可以使用類型參數進行參數化,這樣您就可以在不同的上下文可以提供不同的類型參數,因此您可以將參數化類型實例化為不同的具體類型。這也稱為“模板”或“泛型”,在 OO 語言中通常使用尖括號(例如 T<A>)指定。接口多態性。這基本上是一種機制,您可以將子類型多態性限制為實現特定接口的子類型,或將參數多態性限制為實現特定接口的類型參數。”

5.反思

反射是一種在程序運行時探索有關數據的機制。反射讓您探索有關字段、方法和類構造函數的信息。它還允許您使用在編譯時不存在但在運行時可用的類型。反射和用於發布錯誤信息的邏輯一致模型使得創建正確的動態代碼成為可能。但是對於很多人來說,想知道如何使用反射並不是那麼容易。

提示和建議

“在反射和 Java 的情況下,反射允許被設計為靜態類型的 Java 被動態類型化。動態類型本身並不是邪惡的。是的,它允許程序員打破某些 OOP 原則,但同時它允許許多強大的功能,如運行時代理和依賴注入。是的,Java 允許您使用反射搬起石頭砸自己的腳。但是,您必須非常明確地將槍對準您的腳,取下保險並扣動扳機,”經驗豐富的 Java 程序員和應用程序架構師 Jayesh Lalwani解釋道。

6. 輸入/輸出流

Streams 讓您可以使用任何數據源:Internet、計算機的文件系統或其他。流是一種通用工具。它們允許程序從任何地方(輸入流)接收數據並將其發送到任何地方(輸出流)。他們的任務是相同的:從一個地方獲取數據並將其發送到另一個地方。有兩種類型的流:輸入流(用於接收數據)和輸出流(用於發送數據)。許多人難以理解使用流的原因是 Java 有多個 I/O 流類。

提示和建議

“Java 有如此多的 I/O 流類主要是由於兩個因素。首先是遺產。由於歷史原因,一些類仍然存在,並且由於不被認為是有害的,因此沒有被棄用。第二,靈活性。不同的應用程序有不同的要求,因此,根據您的要求,您有多種選擇。有用的抽象讓您在閱讀時更加清晰,只需幾行代碼,您就可以做很多事情,”來自瑞典的 Java 專家 Jonas Mellin說。您發現 Java 的哪些方面最難理解或停留了一段時間?在評論中分享您的經驗。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION