-
Comparando objetos usando
==
.O operador
==
compara referências de objetos.As referências apontam para endereços na memória, e caso estejam em endereços diferentes, a comparação por meio
==
retornará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); } }
Para comparar objetos em uma classe
Object
existe um método especial -equals()
. Sua implementação padrão, falando francamente, é mais ou menos:public boolean equals(Object obj) { return (this == obj); }
Na própria classe,
Object
a lógica do métodoequals()
é implementada como uma comparação de duas referências. Por sua vez, para comparar objetos corretamente, é necessário redefinir este método de acordo com os critérios que são importantes em um programa específico para objetos específicos. Você mesmo determina os critérios de igualdade.A única coisa que você não deve esquecer é a lista de requisitos para uma substituição adequada
equals()
. Você pode encontrá-los facilmente na Internet, mas nossos alunos bacanas já fizeram um artigo sobre esse assunto . -
Usando variáveis não estáticas em métodos estáticos (e vice-versa).
Se você já viu a inscrição “ Variável não estática x não pode ser referenciada em um contexto estático ” - bem-vindo ao clube :)
Os métodos estáticos não têm acesso a variáveis de classe não estáticas.
Isso é lógico: afinal, um método estático pode ser chamado sem criar um objeto de classe, e todas as variáveis de campo pertencem a objetos específicos. Esta é a contradição que leva ao erro.
Pelo contrário, aliás, é possível: é permitido usar variáveis estáticas em métodos não estáticos:
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);//а так можно! } }
-
Incompreensão de como os parâmetros são passados aos métodos: por referência ou por valor.
Objetos e primitivas são passados para métodos como parâmetros de diferentes maneiras: os primeiros por referência, os últimos por valor.
Os iniciantes geralmente acham esse conceito difícil de entender, fazendo com que seu código se comporte de maneira inesperada:
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++; } }
-
Ignorando as regras de escrita de código.
E isso se aplica não apenas ao cumprimento de certos princípios “técnicos”, mas também a convenções de nomenclatura banais.
Todas essas regras “ como nomear variáveis ”, “ como escrever nomes de métodos ” foram inventadas por uma razão. Isso realmente afeta muito a legibilidade do código.
Ведь 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
в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)
Зепп Бранниган
Nível 41
8 erros comuns de programadores novatos
Olá! Hoje veremos uma lista de 8 erros comuns cometidos por desenvolvedores Java iniciantes (e não apenas). Você encontrará muitas dessas coleções na Internet: muitas delas são semelhantes entre si. Quando compilamos esta lista, fomos guiados por um critério: se cometemos esses erros durante o estudo e o trabalho :) Eles não são priorizados e são igualmente importantes para a compreensão e a lembrança.
GO TO FULL VERSION