-
를 사용하여 객체를 비교합니다
==
.연산자는
==
개체 참조를 비교합니다.참조는 메모리의 주소를 가리키며, 서로 다른 주소에 있는 경우 비교를 통해 가
==
반환됩니다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