《编写高质量代码—改善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程序员遇 ...
随机推荐
- SharePoint 2010 获取列表中所有数据(包括文件夹内)的方法
转: http://blog.csdn.net/wangwenism/article/details/8751411 SharePoint的列表能存储文件以及文件夹,用户使用的时候,经常会建几个分类文 ...
- 说下 winOS / IOS / android /Linux 视频、音频 编码解码问题
最近有朋友遇到一个问题, ios 上传视频文件,想在本地压缩下,然后再上传到服务器. 问有没有什么 视频处理的库, 最近Khronos的webgl 支持HTML5 ,(原理 WebGL 是openGL ...
- (转载)内联函数inline和宏定义
(转载)http://blog.csdn.net/chdhust/article/details/8036233 内联函数inline和宏定义 内联函数的优越性: 一:inline定义的类的内联函 ...
- C# Multilanguage messagebox z
Either way, can't you just call MessageBox.Show(rm.GetString("messageboxData", ci)) class ...
- HDU4614 Vases and Flowers 二分+线段树
分析:感觉一看就是二分+线段树,没啥好想的,唯一注意,当开始摆花时,注意和最多能放的比大小 #include<iostream> #include<cmath> #includ ...
- 【译】 AWK教程指南 10编写可与用户交互的AWK程序
执行awk程序时,awk会自动从文件中读取数据来进行处理,直到文件结束.只要将awk读取数据的来源改成键盘输入,便可设计与awk 交互的程序.本节将提供一个该类程序的范例. 范例:本节将编写一个英语生 ...
- STM32学习笔记——FSMC 驱动大容量NAND FLASH [复制链接]
本文原创于观海听涛,原作者版权所有,转载请注明出处. 近几天开发项目需要用到STM32驱动NAND FLASH,但由于开发板例程以及固件库是用于小页(512B),我要用到的FLASH为1G bit的大 ...
- MFC定时器
比较简单,在程序中可以找到原型. 在程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动.MFC提供了定时器来完成这个功能. ================= ...
- 2.2CUDA-Memory(存储)和bank-conflict
在CUDA基本概念介绍有简单介绍CUDA memory.这里详细介绍: 每一个线程拥有自己的私有存储器,每一个线程块拥有一块共享存储器(Shared memory):最后,grid中所有的线程都可以访 ...
- EXCEL 操作
1.为几万行数据加序号 先在A1,A2分别输入1,2,选中A1:A2,双击A2右下角那个小方块. 数据有多少行就会自动填充多少行(要求:B列数据连续) 2.统计一列中单元格的值等于某个值的单元格的个数 ...