1.使用 == 比较对象
== 运算符比较的是对象的引用。
引用指向对象在内存中的地址。如果它们存储在不同的地址,那么使用==比较就会返回false。
应该使用对象的equals()方法来比较。但是默认的equals()方法比较的是引用(和==一样),所以你应该重写自己的equals()方法。
2.在静态方法中使用非静态变量
你可能遇到过这样的报错:Non-static variable x cannot be referenced from a static context
静态方法不能访问非静态变量(实例变量)。毕竟,静态方法可以在没有对象的情况下调用。
另外,在非静态方法中可以使用静态变量。(因为此时静态变量存在)
3.错误理解参数的传递方式:传引用(地址)还是传值?
参数是对象时传地址,是基本类型(如int)时传值
传值和传地址的区别
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++; } }
输出结果x=7 (没有改变) cat.age = 8 (改变)
4.忽视代码规范
要写具有可读性、符合规范的代码,有意义的命名。
//错误示范: 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; }
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,原理见String Pool
6.错误处理异常
7.不理解操作符(算数、逻辑、其它)
运算符的次序问题
public class Main { public static void main(String[] args) { int i = 6; System.out.println(7 == i++); } }
结果是false,因为==优先级比后++的优先级高,因此会先比较,然后i++。
如果你不清楚运算符的执行优先级,建议使用()提高优先级。并且避免上面比较难懂的写法。
8.在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"); } } } }
The number is equal to 1 The number is equal to 2 The number is equal to 3
别忘记每个case里的break;