-
การเปรียบเทียบวัตถุโดยใช้
==
.ตัวดำเนินการ
==
เปรียบเทียบการอ้างอิงวัตถุการอ้างอิงชี้ไปยังที่อยู่ในหน่วยความจำ และหากที่อยู่ต่างกัน การเปรียบเทียบ
==
จะส่งกลับ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
в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)
Зепп Бранниган
ระดับ
8 ข้อผิดพลาดทั่วไปของโปรแกรมเมอร์มือใหม่
สวัสดี! วันนี้เราจะดูรายการข้อผิดพลาดทั่วไป 8 ข้อที่ทำโดยนักพัฒนา Java ระดับเริ่มต้น (และไม่เพียงเท่านั้น) คุณจะพบคอลเล็กชั่นดังกล่าวมากมายบนอินเทอร์เน็ต: หลายคอลเลกชั่นมีความคล้ายคลึงกัน เมื่อเรารวบรวมรายการนี้ เราได้รับคำแนะนำจากเกณฑ์หนึ่ง: เราทำผิดพลาดเหล่านี้ระหว่างเรียนและทำงานหรือไม่ :) สิ่งเหล่านี้ไม่ได้รับการจัดลำดับความสำคัญและมีความสำคัญเท่าเทียมกันสำหรับการทำความเข้าใจและจดจำ
GO TO FULL VERSION