Java解惑(一)

1.取余操作

    当取余操作返回一个非零的结果时,它与左操作数具有相同的正负符号。Java中取余操作的操作数可以是浮点数类型,C中不允许!

    -3%2=-1;    3%-2=1;
2.浮点型数据精确表示

    System.out.println(2.00 -1.10);//0.8999999999999999 
    上面的计算出的结果不是 0.9,而是一连串的小数。问题在于1.1这个数字不能被精确表示为一个double,因此它被表示为最接近它的double值,该程序从2中减去的就是这个值,但这个计算的结果并不是最接近0.9的double值。一般地说,问题在于并不是所有的小数都可以用二进制浮点数精确表示。 二进制浮点对于货币计算是非常不适合的,因为它不可能将1.0表示成10的其他任何负次幂。因为Java表示浮点数是使用二进制标示的,而0.1即1/10是无法用二进制来表示的。2进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合的数。事实上,只有小数部分以5结尾的小数才能够精确表示,其他无法精确表示的小数,使用最接近它的double数来表示!对于货币计算,要使用int、long或BigDecimal类!执行精确的小数运算使用BigDecimal类!
3.防止溢出

    当操作很大的数字时,应该防止溢出!   

     long microsPerDay = 24 * 60 * 60 * 1000 * 1000;// 正确结果应为:86400000000,但实际上输出结果为:500654080
     long microsPerDay = 24L * 60 * 60 * 1000 * 1000; //结果正确
     两个表达式的实际输出结果不同,问题在于算式1在计算过程中溢出了。Java中默认的整型的字面值常量是int型,因此计算式1完全是以int运算来执行的,并且只有在运算完成之后,其结果才被提升为long,而此时已经太迟:计算已经溢出;而算式2始终是以long型进行运算的,因为我们显示在操作数后加了字母“L”,将被当做long类型处理。

4.内部类访问局部变量

    只有局部内部类,包括匿名内部类(在方法体中进行定义和使用),才可以访问方法的局部变量,而且必须声明局部变量为final类型。普通的非静态内部类,静态内部类不可以访问方法体内的局部变量。之所以要求将局部变量声明为final类型,是因为内部类可能产生隐式的“闭包”,闭包使得局部变量脱离它所在的方法继续存在。比如在一个方法中,我们新建一个线程,线程中使用了方法中的某个局部变量。只要方法的生命周期结束了,局部变量的作用域也就随之结束了,但只要该线程run方法没有执行结束,将一直可以访问该局部变量的值;这就是内部类扩大了局部变量的作用域。如果不将其声明为final类型,也就是说该变量的值可以随意改变,那将引起极大的混乱,所以java编译器要求所有被内部类访问的局部变量必须声明为final类型。

5.Java的强制转型机制(这里仅针对引用类型)

    在编译阶段,强制转型要求被转型变量的编译时类型与目标类型必须是如下三种情况之一:类型相同是目标类型的子类(自动向上转型,无需强制转换)是目标类型的父类。若两者之间没有任何继承关系,则提示编译错误。

    在运行阶段,被转型变量所引用对象的实际类型必须是目标类型的实例,或者是目标类型的子类、实现类的实例,否则将引发ClassCastException异常!

    instanceof运算符的处理遵循上面的原则!

6.循环体中的执行语句

    Java语言规定,for,while或者do循环中的重复执行语句不能是一条单独的局部变量定义语句,如果程序需要使用循环来重复定义局部变量,这条局部变量定义语句必须放在花括号内才有效。

for(int i = 0; i < 10; i++)
{
    Object obj = new Object(); //需要使用花括号,否则编译错误
}

7.构造器声明的异常
    实例初始化操作是优先于构造器执行的,但实质上来说这些初始化操作都是放到构造器中执行的,因此,类的构造器必须声明捕获实例初始化操作可能产生的受检查的异常!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值