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。