黑马程序员--java编程中一些小建议积累
建议1:
不要在常量和变量中出现容易混淆的字母:如long i = 1L,表示long类型,后面的l最好大写
建议2:
不要让常量蜕变成变量,常量应该在编译期就确定。
如:publicstatic final int RAND_CONST = new Random().nextInt();
建议3:
三元操作符的类型务必一致
如:
public class Suggest3 { public static void main(String[] args) { int i = 80; String s = String.valueOf(i < 100 ? 90 : 100); // 100.0为float类型,返回值时,90会被自动提升为90.0,所以两个String不是同一个对象 String s1 = String.valueOf(i < 100 ? 90 : 100.0); System.out.println(s == s1); /* * 上面提到三元运算符的一个类型转换问题 * 1,若两个操作数不可转换,则不转换,返回Object * 2,若连个数都是明确的表达式,则int转long,long转float * */ } } public class Suggest3 { public static void main(String[] args) { int i = 80; String s = String.valueOf(i < 100 ? 90 : 100); // 100.0为float类型,返回值时,90会被自动提升为90.0,所以两个String不是同一个对象 String s1 = String.valueOf(i < 100 ? 90 : 100.0); System.out.println(s == s1); /* * 上面提到三元运算符的一个类型转换问题 * 1,若两个操作数不可转换,则不转换,返回Object * 2,若连个数都是明确的表达式,则int转long,long转float * */ } }
建议4:
使用变长方法时,避免带有变长参数的方法重载:
如:
public class Suggest4 { public static void main(String[] args) { // 执行的是简单折扣的方法,虽然多次折扣的方法也包括了改参数类型 // 最好不要用,容易引起混淆 calPrice(100, 75); calPrice(100, 75, 80); } public static void calPrice(int price, int discount) { float money = price * discount / 100.0F; System.out.println("折扣后的价是:" + money); } // 方法重载 ,传入可变长参数 public static void calPrice(int price, int... discount) { float money = price; for (int d : discount) { money = money * d / 100.0F; } System.out.println("多次折扣后的价是:" + money); } public class Suggest4 { public static void main(String[] args) { // 执行的是简单折扣的方法,虽然多次折扣的方法也包括了改参数类型 // 最好不要用,容易引起混淆 calPrice(100, 75); calPrice(100, 75, 80); } public static void calPrice(int price, int discount) { float money = price * discount / 100.0F; System.out.println("折扣后的价是:" + money); } // 方法重载 ,传入可变长参数 public static void calPrice(int price, int... discount) { float money = price; for (int d : discount) { money = money * d / 100.0F; } System.out.println("多次折扣后的价是:" + money); } }
建议5:
警惕自增的陷阱:
看下面这段代码
public class Suggest5 { public static void main(String[] args) { int count = 0; for (int i = 0; i < 10; i++) { // count++是一个表达式,返回count自加前的值 count = count++; } System.out.println(count); } } public class Suggest5 { public static void main(String[] args) { int count = 0; for (int i = 0; i < 10; i++) { // count++是一个表达式,返回count自加前的值 count = count++; } System.out.println(count); } }
输出count的值是0
建议6:
避免instanceof非预期结果
/详细分析instanceof() public class Suggest6 { public static void main(String[] args) { // 判断String对象是否是Object对象的实例 // true boolean b1 = "cloud" instanceof Object; // String对象是否是String的实例 // true boolean b2 = new String() instanceof String; // Object对象是否是String的实例 // false,Object是String的父类,编译可以通过 boolean b3 = new Object() instanceof String; // 拆箱类型是否是装箱类型的实例,编译不通过,char类型是基本类型,instanceof只用于对象的判断 // boolean b4 = 'A' instanceof Character; // 空对象是否是String的实例 // false,规则:如果左操作数是null,则直接返回false不再运算右边 boolean b5 = null instanceof String; // 转换类型后的null是否是String类型的对象 // false,null没有类型,做类型转换后还是null boolean b6 = (String) null instanceof String; // Data对象是否是String对象的实例,编译不通过,Date类和String没有继承或实现关系 // boolean b7 = new Date() instanceof new String; } } //详细分析instanceof() public class Suggest6 { public static void main(String[] args) { // 判断String对象是否是Object对象的实例 // true boolean b1 = "cloud" instanceof Object; // String对象是否是String的实例 // true boolean b2 = new String() instanceof String; // Object对象是否是String的实例 // false,Object是String的父类,编译可以通过 boolean b3 = new Object() instanceof String; // 拆箱类型是否是装箱类型的实例,编译不通过,char类型是基本类型,instanceof只用于对象的判断 // boolean b4 = 'A' instanceof Character; // 空对象是否是String的实例 // false,规则:如果左操作数是null,则直接返回false不再运算右边 boolean b5 = null instanceof String; // 转换类型后的null是否是String类型的对象 // false,null没有类型,做类型转换后还是null boolean b6 = (String) null instanceof String; // Data对象是否是String对象的实例,编译不通过,Date类和String没有继承或实现关系 // boolean b7 = new Date() instanceof new String; } }
补充:软件开发 , Java ,