《编写高质量代码—改善java程序的151个建议》知识整理一
1、用偶判断,不用奇判断
案例:在代码i%2==1?"奇数":"偶数" (java中的求余算法相当于:divided-divided/divisor*divisor)中,当被除数i为-1时,结果是偶数,判断失误,所以该程序应改为:i%2==0?"偶数":"奇数"
2、不要让类型默默转化
案例:代码long d=lg*60*8,当整型的lg参数和另外两个参数相乘超出整型边界的时候就会变成负数,在转换为long型,结果还是负值
所以代码需要改为:long d=lg*60*8*1l;
3、在接口中不要存在实现代码
public class Client {
public static void main(String[] args) {
//调用接口的实现
B.s.doSomething();
}
} interface B {
public static final S s=new S(){
public void doSomething(){
System.out.println("我在接口中实现了");
}
};
} interface S {
public void doSomething();
}虽然成功打印出了结果。但是如果把实现代码写到接口中,那接口就绑定了可能变化的因素,这就会导致实现不再稳定和可靠,是随时都可能被抛弃、呗更改、被重构的。所以接口中虽然可以有实现,但应该避免使用。
4、静态变量一定要先声明后赋值
代码:
public class demo2 { static{
i=100;
}
public static int i=1;
public static void main(String[] args) {
System.out.println(i);
} }public class demo2 {
public static int i=1;
static{
i=100;
}
//public static int i=1;
public static void main(String[] args) {
System.out.println(i);
} }两段代码的输出结果分别为:1和100,两段代码都能编译,都有结果,值却不一样,这是什么原因呢?我们知道静态变量是类加载时被分配到数据区(Date Area)的,它在内存中只有一个拷贝,它以后的所有操作都是只改变值而不改变地址,而jvm是先声明再赋值,例如:int i=100;等价于int i;//分配地址 i=100//赋值,所以在类初始化的时候,jvm会查找类中的所有静态声明进行加载,然后分配空间。所以向上面这种情况,只是完成了地址空间的分配,而没有赋值,之后jvm就会按照先后顺序来进行复制,所以第二段代码到最后输出的结果为1也就不足为奇了。
5、不要覆写(Override)静态方法,可以隐藏
代码:
public class Baseextend {
public static void doSomething(){
System.out.println("我是父类静态方法");
}
public void doAnything(){
System.out.println("我是父类非静态方法");
}
} public class Subextend extends Baseextend{ public static void doSomething(){
System.out.println("我是子类静态方法");
}
public void doAnything(){
System.out.println("我是子类非静态方法");
}
} public class Extendtext {
@SuppressWarnings("static-access")
public static void main(String[] args) {
Baseextend base=new Subextend();
base.doSomething();
base.doAnything(); }
}上面的输出结果为:我是父类静态方法 我是子类非静态方法
分析原因:我们知道一个实例对象有两个类型:表面类型(Apparent Type)和实际类型(Actual Type),表面类型是声明时的类型,实际类型是对象产生时的类型。比如例子base的表面类型是Baseextend,实际类型是Subextend。对于非静态方法,它是根据对象的实际类型来执行的,对于静态方法,如果采用类实例(对象)的方法来访问,jvm则会通过对象的表面类型来访问对应的静态方法,所以出现上面的结果也就不足为奇了。
《编写高质量代码—改善java程序的151个建议》知识整理一的更多相关文章
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 编写高质量代码改善java程序的151个建议——[1-3]基础?亦是基础
原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himse ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
- 编写高质量代码:改善Java程序的151个建议 --[106~117]
编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject { // 定义一个方法 public void reques ...
- 编写高质量代码:改善Java程序的151个建议 --[78~92]
编写高质量代码:改善Java程序的151个建议 --[78~92] HashMap中的hashCode应避免冲突 多线程使用Vector或HashTable Vector是ArrayList的多线程版 ...
- 编写高质量代码:改善Java程序的151个建议 --[65~78]
编写高质量代码:改善Java程序的151个建议 --[65~78] 原始类型数组不能作为asList的输入参数,否则会引起程序逻辑混乱. public class Client65 { public ...
- 编写高质量代码:改善Java程序的151个建议 --[52~64]
编写高质量代码:改善Java程序的151个建议 --[52~64] 推荐使用String直接量赋值 Java为了避免在一个系统中大量产生String对象(为什么会大量产生,因为String字符串是程序 ...
- 编写高质量代码:改善Java程序的151个建议 --[36~51]
编写高质量代码:改善Java程序的151个建议 --[36~51] 工具类不可实例化 工具类的方法和属性都是静态的,不需要生成实例即可访 问,而且JDK也做了很好的处理,由于不希望被初始化,于是就设置 ...
- Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议
在通往"Java技术殿堂"的路上,本书将为你指点迷津!内容全部由Java编码的最佳 实践组成,从语法.程序设计和架构.工具和框架.编码风格和编程思想等五大方面,对 Java程序员遇 ...
随机推荐
- myeclipse2015不能启动tomcat,提示: Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at local
myeclipse2015不能启动tomcat,提示: Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at local ...
- java.lang.UnsupportedOperationException
在运行路况预测这个项目时,报错出现:java.lang.UnsupportedOperationException 原因:我将1.3版本和1.6版本的两个jar包都Add to Build Path ...
- jquery 日期控件
控件官网: http://www.interidea.org/demo/icalendar.php#demohtml绑定控件 $("#startdate").icalendar({ ...
- ASP.NET_验证控件(class0620)
为什么使用验证控件 当需要让用户输入数据时,用户有可能输入不符合我们程序逻辑要求的信息,所以我们要对输入进行验证. 客户端验证(用户体验,减少服务器端压力) 服务器端验证(防止恶意攻击,客户端js很容 ...
- Android--应用开发3(Android layout XML属性)
Android layout XML属性 转载:http://www.cnblogs.com/playing/archive/2011/04/07/2008620.html Layout对于迅速的搭建 ...
- leetcode@ [22]Generate Parentheses (递归 + 卡特兰数)
https://leetcode.com/problems/generate-parentheses/ Given n pairs of parentheses, write a function t ...
- HDU-4662 MU Puzzle 水题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662 倒推考虑长度就可以了. //STATUS:C++_AC_31MS_240KB #include ...
- Redis的探究
之前大四时候实习的公司有使用过Redis,不过那时所有配置均由主管完成了,而我也只是处于能使用的阶段. 时隔1年多,近期回想起这货,在研究中,想把它整合进现在公司的网站系统中,做做数据快照(已完成)和 ...
- 组建Windows家庭组
这里,是必须得针对Windows 7.8.10而言,因为,Windows XP 和 Windows Vista系统没有家庭网络的功能.(比较过时的一些系统了) 1.Windows家庭组的简介 使用家庭 ...
- php self
self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量. 假如我们使用类里面静态(一般用关键字static)的成员,我们也必须使用self来调用. 还要 ...