-
Порівняння об'єктів за допомогою
==
.Оператор
==
порівнює посилання на об'єкти.Посилання вказують на адресаи в пам'яті, і якщо вони знаходяться на різні адресаи, порівняння через
==
буде повертати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()
. Ти легко знайдеш їх в Інтернеті, але наші круті учні вже зробабо статтю на цю тему . -
Використання нестатичних змінних у статичних методах (і навпаки).
Якщо ти хоч раз бачив напис « Ласкаво просимо до клубу :)
Статичні методи не мають доступу до нестатичних змінних класів.
Це логічно: адже статичний метод можна викликати, не створюючи об'єкт класу, а всі змінні поля належать конкретним об'єктам. У цьому полягає суперечність, що призводить до помилки.
Навпаки, до речі, можна використовувати статичні змінні в нестатичних методах припустимо:
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++; } }
Якщо в цьому прикладі ти точно не знаєш, яке число збільшиться, а яке ні (звичайне число або вік кота), тоді перечитай ще раз нашу лекцію на цю тему .
-
Ігнорування правил написання коду.
І це стосується не лише дотримання тих чи інших «технічних» принципів, а й банальних угод про іменування.
Всі ці правила " як треба називати змінні ", " як треба писати назви методів " були придумані не просто так. Це і справді сильно впливає на читання коду.
Адже код не завжди буде лише твоїм. Ти можеш перевестися на інший проект у компанії, і він перейде у спадок до твоїх колег, які будуть явно не в захваті, отримавши в роботу щось на кшталт цього:
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; }
Твій код може бути геніальним з погляду продуктивності, але якщо його неможливо прочитати і зрозуміти як він, власне, працює, ціна його, на жаль, невелика.
Дотримуйся стандартів написання, і твій код, навіть далекий від ідеалу, хоча б прочитають досвідченіші товариші і підкажуть, що з технічного погляду в ньому можна покращити :)
-
Нерозуміння роботи класу
String
public class Main { public static void main(String[] args) { String s1 = "Я изучаю Java"; String s2 = new String("Я изучаю Java"); System.out.println(s1 == s2); } }
Якщо ти не знаєш, чому цей код виводить
false
, знання явно потрібно підтягнути:)Новачки часто не знають що таке
String Pool
і як він працює.Як наслідок, не до кінця зрозуміло, як правильно порівнювати рядки у своєму коді. В одній із наших лекцій ми докладно розглядали цю тему
-
Неправильна робота із винятками.
Це властиво не лише новачкам, а й досвідченим розробникам. Причин кілька.
По-перше, універсального рецепту немає. Помилки в програмі бувають різні, сценарії їхньої обробки, відповідно, теж. По-друге, не всі розуміють структуру
stackTrace
, а антипаттернів обробки помилок дуже багато, і кожен із них «неправильний» по-своєму. Так що варіантів зробити неправильно тут набагато більше, ніж будь-де.Поширені антипатерни наведені тут:
-
Неповне розуміння роботи операторів (арифметичних, логічних та інших).
Простий приклад. Чи зможеш відразу сказати, що виведе цей код?
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
Якщо ти відповів неправильно або навмання, значить, у цій галузі поки є прогалини:)
Код виведе
false
, тому що пріоритет у оператора порівняння==
вищий, ніж у постфіксного інкременту++
. Тому спочатку буде виконано порівняння7 == i
, і лише потім – операціяi++
.З цієї теми, до речі, ми теж мали докладну лекцію. Ось посилання , якщо пропустив.
-
Пропуск слова
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 частих помилок програмістів-початківців
Вітання! Сьогодні ми розглянемо список із 8 поширених помилок початківців (та й не тільки) Java-розробників. У Мережі ти знайдеш чимало таких добірок: багато хто з них схожий один на одного. Коли ми складали цей список, орієнтувалися на один критерій: чи припускалися ці помилки самі під час навчання та роботи :) Вони розставлені не за пріоритетом і однаково важливі для розуміння та запам'ятовування.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ