-
使用==比較對象。
==運算符比較對象引用。
引用指向內存中的地址。如果它們存儲在不同的地址,則使用==進行比較將返回false。
public class Vehicle { String model; int maxSpeed; int yearOfManufacture; public Car(String model, int maxSpeed, int yearOfManufacture) { this.model = model; this.maxSpeed = maxSpeed; this.yearOfManufacture = yearOfManufacture; } public static void main(String[] args) { Car ferrari = new Car("Ferrari 360 Spider", 280, 1996); Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996); System.out.println(ferrari == ferrariTwin); } }
為了比較對象,Object類有一個特殊的方法:equals()。坦率地說,它的默認實現還不錯:
public boolean equals(Object obj) { return (this == obj); }
在Object類本身中,equals()方法是作為兩個引用的比較來實現的。反過來,為了正確比較對象,您需要根據特定程序中與特定對象相關的標準重新定義此方法。平等的標準取決於你。
唯一不能忘記的是正確覆蓋equals()的要求列表。您可以輕鬆地在 Internet 上找到它們。
-
在靜態方法中使用非靜態變量(反之亦然)。
如果您曾看到消息“無法從靜態上下文中引用非靜態變量 x”,歡迎加入俱樂部 :)
靜態方法無法訪問非靜態(實例)變量。
這是有道理的:畢竟,靜態方法可以在不創建其類的對象的情況下被調用,並且所有字段都屬於特定對象。這就是導致錯誤的矛盾所在。
順便說一下,換一種方式也行得通:您可以在非靜態方法中使用靜態變量:
public class Main { public int x = 10; public static int staticX = 100; public static void main(String[] args) { System.out.println(x); // Compilation error - you can't do this! } public void printX() { System.out.println(staticX); // But you can do this! } }
-
誤解如何將參數傳遞給方法:通過引用或通過值。
對象和原語以兩種不同的方式傳遞給方法:首先,通過引用;第二,按價值。
初學者往往很難理解這個概念。結果,他們的代碼表現出意外:
public class Main { public static void main(String[] args) { int x = 7; incrementNumber(x); System.out.println(x); Cat cat = new Cat(7); catLevelUp(cat); System.out.println(cat.getAge()); } public static void catLevelUp(Cat cat) { cat.setAge(cat.getAge()+1); } public static void incrementNumber(int x) { x++; } }
如果您不確切知道哪個數字會增加而哪個不會(普通的舊數字或貓的年齡),請重新閱讀我們關於該主題的課程。
-
忽略編碼規則。
這不僅適用於遵守某些“技術”原則,也適用於世俗的命名約定。
所有這些規則(如何命名變量,如何編寫方法名稱)都是出於某種原因而發明的。它們真正影響代碼的可讀性
畢竟,代碼不會永遠是你一個人的。您可能會被調到公司的另一個項目。繼承你代碼的同事看到這樣的事情顯然不會高興:
public class Cat { private int S_O_M_E_T_H_I_N_G = 7; public String striiiiiiiiiiiiiing; protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14; boolean random = Math.random() > 0.5; }
您的代碼可能具有巧妙的高性能,但如果無法閱讀和理解它的實際工作原理,那麼它就沒有多大價值。
如果你堅持編碼標準,那麼即使你的代碼遠非理想,至少你更有經驗的同事能夠告訴你如何從技術角度改進它:)
-
對String類的誤解
public class Main { public static void main(String[] args) { String s1 = "I'm learning Java"; String s2 = new String("I'm learning Java"); System.out.println(s1 == s2); } }
如果你不知道為什麼這段代碼顯示false,你顯然需要加強你的知識 :)
初學者通常不知道字符串池及其工作原理。
因此,他們並不完全了解如何在代碼中正確比較字符串。我們在其中一節課中詳細探討了這個主題。
-
錯誤地處理異常。
初學者並不是唯一偶然發現這一點的人。經驗豐富的開發人員也會被絆倒。原因很多。
首先,沒有萬能的配方。程序有各種不同的錯誤和不同的錯誤處理場景。
其次,並不是每個人都了解堆棧跟踪的結構。有很多錯誤處理反模式,它們中的每一個都以自己的方式“錯誤”。這意味著錯誤處理比其他任何事情都容易出錯。
-
不完全理解運算符(算術、邏輯等)的工作原理。
這是一個簡單的例子。你能馬上看出這段代碼將顯示什麼嗎?
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
如果您回答錯誤或只是猜到了,那麼您在這方面仍然存在知識空白 :)
代碼將顯示false,因為相等運算符 ( == ) 比後綴遞增運算符 ( ++ ) 具有更高的優先級。因此,先執行7 == i比較,然後才執行i++操作。
對了,我們也有這方面的詳細教訓。如果你錯過了,這裡是鏈接。
-
在switch語句中省略單詞break。
很多看這篇文章的人肯定都犯過這個錯誤!:)
public class Main { public static void main(String[] args) { int i = 1; switch (i) { case 1: { System.out.println("The number is equal to 1"); } case 2: { System.out.println("The number is equal to 2"); } case 3: { System.out.println("The number is equal to 3"); } } } }
結果,執行遍歷了所有可能的選項:
輸出:
數字等於1 數字等於2 數字等於3
當其中一個選項執行完畢時,break語句會中斷switch語句的執行。不要忘記它,否則你可能會得到意想不到的結果:)
菜鳥程序員常犯的8個錯誤
你好!今天,我們將了解新手(和其他)Java 開發人員犯的 8 個非常常見的錯誤。您會在網絡上找到大量此類列表:其中許多彼此相似。當我們編制清單時,我們遵循一個標準:我們是否在學習或就業期間自己犯了錯誤:)它們沒有按重要性排序——它們對您理解和記住同樣重要。
GO TO FULL VERSION