-
使用 比較物件
==
。運算符
==
比較物件引用。引用指向記憶體中的位址,如果它們位於不同的位址,則比較
==
將傳回false
。public class Car { 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()
。你可以很容易地在網路上找到它們,但是我們很酷的學生已經就這個主題寫了一篇文章。 -
在靜態方法中使用非靜態變數(反之亦然)。
如果您曾經看過「非靜態變數 x 不能從靜態上下文中引用」的字樣- 歡迎來到俱樂部:)
靜態方法無法存取非靜態類別變數。
這是合乎邏輯的:畢竟,無需建立類別物件就可以呼叫靜態方法,並且所有欄位變數都屬於特定物件。這就是導致錯誤的矛盾。
相反,順便說一句,這是可能的:在非靜態方法中允許使用靜態變數:
public class Main { public int x = 10; public static int staticX = 100; public static void main(String[] args) { System.out.println(x);//ошибка компиляции, так нельзя! } public void printX() { System.out.println(staticX);//а так можно! } }
-
對參數如何傳遞給方法的誤解:透過引用或透過值。
物件和基元以不同的方式作為參數傳遞給方法:前者透過引用,後者透過值。
初學者經常發現這個概念很難掌握,導致他們的程式碼表現異常:
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++; } }
如果在這個例子中你不知道哪個數字會增加,哪個不會(通常的數字或貓的年齡),那麼請再次閱讀我們關於這個主題的講座。
-
忽略編寫程式碼的規則。
這不僅適用於遵守某些「技術」原則,也適用於平庸的命名約定。
所有這些規則「如何命名變數」、「如何寫方法名稱」都是有原因的。這確實極大地影響了程式碼的可讀性。
Ведь code не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:
public class Cat { private int S_O_M_E_T_H_I_N_G = 7; public String striiiiiiiiiiiiiing; protected double X3_4TO_ET0_TAK0E = 3.14; boolean random = Math.random() > 0.5; }
Твой code может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять How он, собственно, работает, цена его, увы, невелика.
Придерживайся стандартов написания, и твой code, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)
-
Непонимание работы класса
String
public class Main { public static void main(String[] args) { String s1 = "Я изучаю Java"; String s2 = new String("Я изучаю Java"); System.out.println(s1 == s2); } }
Если ты не знаешь, почему этот code выводит
false
, знания явно нужно подтянуть:)Новички часто не знают что такое
String Pool
и How он работает.Как следствие, не до конца ясно, How правильно сравнивать строки в своем codeе. В одной из наших лекций мы подробно рассматривали эту тему
-
Неправильная работа с исключениями.
Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.
Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру
stackTrace
, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.Распространенные антипаттерны приведены здесь:
-
Неполное понимание работы операторов (арифметических, логических и других).
Простой пример. Сможешь сходу сказать, что выведет этот code?
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
Если ты ответил неправильно or наугад, значит, в этой области пока есть пробелы:)
Код выведет
false
, потому что приоритет у оператора сравнения==
выше, чем у постфиксного инкремента++
. Поэтому сначала будет выполнено сравнение7 == i
, и только потом - операцияi++
.По этой теме, кстати, у нас тоже была подробная лекция. Вот link, если пропустил.
-
Пропуск слова
break
в оператореswitch
.Эту ошибку, вероятно, допускали многие из читателей!)
public class Main { public static void main(String[] args) { int i = 1; switch (i) { case 1: { System.out.println("Число равно 1"); } case 2: { System.out.println("Число равно 2"); } case 3: { System.out.println("Число равно 3"); } } } }
В результате на них обрушивается водопад из всех возможных вариантов:
Вывод:
Число равно 1 Число равно 2 Число равно 3
Оператор
break
прерывает работу оператораswitch
в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)
Зепп Бранниган
等級 41
新手程式設計師常犯的8個錯誤
你好!今天,我們將看看初學者(不僅僅是)Java 開發人員所犯的 8 個常見錯誤。您會在互聯網上找到許多這樣的集合:其中許多彼此相似。當我們編制這份清單時,我們遵循一個標準:我們自己在學習和工作中是否犯過這些錯誤:)它們沒有優先順序,對於理解和記憶同樣重要。
GO TO FULL VERSION