Java易忘易混淆知识点笔记

来源:互联网 发布:win7网络登录不见了 编辑:程序博客网 时间:2024/05/07 19:25

1.Java合法标识符规则一般是:标识符由字母、数字、下划线“_”、美元符号“$”组成,并且首字母不能是数字,并且不是系统保留字。

但是由于Java是使用Unicode,因此不光是美元符号,¥、£等也都可以,中文、日文等其他国家语言也都可以出现在标识符中如:

String £="123";
float 浮点数=4.76f;
int α=110;


2.多行注释/* */之间出现的注释起始符号,例如//、/*、//*等,编译器将其自动视为普通字符,即多行注释里面的单行注释是不起作用的,不做处理。

因此对于/*  //  */这个注释是有效的,而不会因为单行注释注释掉了多行注释的闭合部分。但是多行注释不能嵌套,如下是错误的:

/*

*/*  多行注释内部嵌套的多行注释 */

*/


3.两个整数之间相除,如果除数是0那么会报错,java.lang.ArithmeticException: / by zero

但是如果有任一个是浮点数,比如1.0/0 或者1/0.0 那么就不会报错,除的结果是Infinity,而0.0/0结果是NaN。

即,在浮点数的世界里不会抛出除0错,而是会返回正无穷大或负无穷大或NaN。 
究其原因,可能是因为在浮点数运算中,不存在真正意义上的0,而是一个无限接近于0的浮点数。


4.Java中%不光可以对整数取模,也可以对浮点数进行取模。如5.2%1.2,不过结果未必很精确,结果是0.40000000000000036,这应该也是和浮点数的性质有关。


5.取反运算符“~”,对参与运算的数的各二进制位按位取反。计算机中的数是按补码形式存储,因此先表示成补码形式,然后对每一位取反,然后再由补码转换回来。

~2=-3:2的补码是0000 0000 0000 0000 0000 0000 0000 0010

 所以按位取反后是1111 1111 1111 1111 1111 1111 1111 1101

最高位符号位是1故为负数,根据负数的补码转换规则“各位取反再加1”即为000 0000 0000 0000 0000 0000 0000 0011,也就是3,所以最终结果是-3.

~(-2)=1:-2的补码是1111 1111 1111 1111 1111 1111 1111 1110

 所以按位取反后是0000 0000 0000 0000 0000 0000 0000 0001

最高位符号位是0故为正数,也就是1,所以最终结果是1.

~0=-1:0的补码是0000 0000 0000 0000 0000 0000 0000 0000

 所以按位取反后是1111 1111 1111 1111 1111 1111 1111 1111

最高位符号位是1故为负数,根据负数的补码转换规则“各位取反再加1”即为000 0000 0000 0000 0000 0000 0000 0001,也就是1,所以最终结果是-1.


6.逻辑运算符&&、||和位运算符&、|都可以作用于逻辑运算中,前者具有“短路运算”功能,即如果&&、||的前面部分已经能得出整个表达式的值就不再继续算后面的了

如:下面的程序的输出结果为a:0 b:1

int a=0,b=0;if(true || b<a++)System.out.println("a:"+a);if(true | a<b++)System.out.println("b:"+b);
其实Eclipse自动就会提示第一个if中||后面为dead code,即不可能会执行这部分的代码,而第二个if中没有提示。


7.Java中long型占64位,float占32位,但是long可以自动转换为float类型的。long型转化为float、double类型都可能会有精度损失。

float的精确位数为7位(整数位的数字个数+小数位的数字个数=7),double的精确位数为16位(整数位的数字个数+小数位的数字个数=16).


8.类变量(即用static修饰)会自动初始化,而方法中的局部变量不行,不过基本类型的数组元素也会自动初始化。

public class Dog{private static int i;    public int j=1;    public int a;    public static void main(String[] args){          System.out.println(i);//正确,输出0           //System.out.println(j);//错误!静态方法中不能引用非静态变量j           //public static int j=10; //错误!public和static不能用于方法内的变量定义           //int k;          //System.out.println(k);//错误!变量k没有初始化           Dog d=new Dog();          System.out.println(d.a);//正确,输出0                    int b[]=new int[3];          System.out.println(b[2]);//正确,输出0}}

9.目前(JDK1.7)switch可以使用的类型为char、short、int、enum、String。其中前三个是一开始就可以的,enum是JDK1.5加入的,String貌似是JDK1.6加入的。如果尝试用long,则提示Cannot switch on a value of type long. Only convertible int values, strings or enum constants are permitted。


10.try、catch、finally不能单独使用,必须要有try,从语法上讲,可以没有catch或没有finally。


原创粉丝点击