-
使用==比较对象。
==运算符比较对象引用。
引用指向内存中的地址。如果它们存储在不同的地址,则使用==进行比较将返回false。
public class Vehicle { 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()的要求列表。您可以轻松地在 Internet 上找到它们。
-
在静态方法中使用非静态变量(反之亦然)。
如果您曾看到消息“无法从静态上下文中引用非静态变量 x”,欢迎加入俱乐部 :)
静态方法无法访问非静态(实例)变量。
这是有道理的:毕竟,静态方法可以在不创建其类的对象的情况下被调用,并且所有字段都属于特定对象。这就是导致错误的矛盾所在。
顺便说一下,换一种方式也行得通:您可以在非静态方法中使用静态变量:
public class Main { public int x = 10; public static int staticX = 100; public static void main(String[] args) { System.out.println(x); // Compilation error - you can't do this! } public void printX() { System.out.println(staticX); // But you can do this! } }
-
误解如何将参数传递给方法:通过引用或通过值。
对象和原语以两种不同的方式传递给方法:首先,通过引用;第二,按价值。
初学者往往很难理解这个概念。结果,他们的代码表现出意外:
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 I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14; boolean random = Math.random() > 0.5; }
您的代码可能具有巧妙的高性能,但如果无法阅读和理解它的实际工作原理,那么它就没有多大价值。
如果你坚持编码标准,那么即使你的代码远非理想,至少你更有经验的同事能够告诉你如何从技术角度改进它:)
-
对String类的误解
public class Main { public static void main(String[] args) { String s1 = "I'm learning Java"; String s2 = new String("I'm learning Java"); System.out.println(s1 == s2); } }
如果你不知道为什么这段代码显示false,你显然需要加强你的知识 :)
初学者通常不知道字符串池及其工作原理。
因此,他们并不完全了解如何在代码中正确比较字符串。我们在其中一节课中详细探讨了这个主题。
-
错误地处理异常。
初学者并不是唯一偶然发现这一点的人。经验丰富的开发人员也会被绊倒。原因很多。
首先,没有万能的配方。程序有各种不同的错误和不同的错误处理场景。
其次,并不是每个人都了解堆栈跟踪的结构。有很多错误处理反模式,它们中的每一个都以自己的方式“错误”。这意味着错误处理比其他任何事情都容易出错。
-
不完全理解运算符(算术、逻辑等)的工作原理。
这是一个简单的例子。你能马上看出这段代码将显示什么吗?
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
如果您回答错误或只是猜到了,那么您在这方面仍然存在知识空白 :)
代码将显示false,因为相等运算符 ( == ) 比后缀递增运算符 ( ++ ) 具有更高的优先级。因此,先执行7 == i比较,然后才执行i++操作。
对了,我们也有这方面的详细教训。如果你错过了,这里是链接。
-
在switch语句中省略单词break。
很多看这篇文章的人肯定都犯过这个错误!:)
public class Main { public static void main(String[] args) { int i = 1; switch (i) { case 1: { System.out.println("The number is equal to 1"); } case 2: { System.out.println("The number is equal to 2"); } case 3: { System.out.println("The number is equal to 3"); } } } }
结果,执行遍历了所有可能的选项:
输出:
数字等于1 数字等于2 数字等于3
当其中一个选项执行完毕时,break语句会中断switch语句的执行。不要忘记它,否则你可能会得到意想不到的结果:)
菜鸟程序员常犯的8个错误
你好!今天,我们将了解新手(和其他)Java 开发人员犯的 8 个非常常见的错误。您会在网络上找到大量此类列表:其中许多彼此相似。当我们编制清单时,我们遵循一个标准:我们是否在学习或就业期间自己犯了错误 :) 它们没有按重要性排序——它们对您理解和记住同样重要。
GO TO FULL VERSION