1.关键字和保留字:
abstract
stricfp
其中很容易搞混或忽略的是:null、true、false、volatile、native、stricftp、assert、enum、synchronized
native:指出方法是与平台相关的语言(如C)编写的
stricftp:用在方法或类的前面,指出在所有表达式中的浮点数将尊守严格的FP限制规定
synchronized:指出方法只能同时被一个线程访问
transient:防止字段被永远串行化。当串行化对象时,总是跳过transient字段
volatile:指出变量可能改变,失去同步,因为它被用在多个线程中。
注意:
(1)在java语言中,英文字母大小写敏感。所以要注意所有的关键字与保留字都是小写的,null是关键字,但NULL不是关键字;
(2)注意true与false在java中也是关键字;
(3)const:不要用于声明常量,请使用public
(4)注意SIZEOF\Friend不是java中的关键字,不要跟C++搞混。
2.变量命名规则:每个变量的第一个字符必须是字母、美元符号或下划线;特殊符号只能用$,其它特殊字符中有特殊用途的不能出现在字母中,如:+,-,/,*,@,%,^,&,~,#等。以下是正确命名:Java, _java, $java, my_java,java2.以下是错误命名:2java,@java,oh!,%java,java#,#java,^java, my-java,my=java等。
3.整数类型:联想8421码就可以记住了。
byte | 8-bit | | +127 | Byte |
short | 16-bit | | +215 – 1 | Short |
int | 32-bit | | +231 – 1 | Integer |
long | 64-bit | | +263 – 1 | Long |
值得注意的是八进制中不可用8和9两个数字,如果用了,编译将出错,如:018,程序在编译时就会出现“interger number too large"。所以没事就不要打荤,在整数前面乱加0。
4.在表达式中放大类型转换是属于自动类型转换,而缩小类型转换是强制类型转换,但存在数据丢失的危险。道理很简单,小水杯中的水倒进大水杯中肯定没有任何安全问题,相反,大水杯的水倒进小水杯存在装不了所有的水的危险。所以:byte->short->int->short->float->double 这样的顺序是属于放大且自动类型转换,而反过来就是缩小且需要强制类型转换。一般的数据类型转换中要注意的:char也可以放大且自动类型转换成int;boolean数据类型无法转换成其他几各数据类型,而其他数据类型也无法转换成boolean数据类型,切记!!
注意:float f = 1.0; //报错,1.0默认是double,缩小类型需要强制转换,可改成float f = (float)1.0或float f = 1.0f; float f = 12;//正确,放大类型,int自动转换为float.
对于整数来讲,通过算术表达式计算完的结果只会变成int类型!!Why ?因为怕运算后的结果会超出原来数据类型的范围!!
经典的面试题:
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错 ?
short s1 = 1; s1 = s1 + 1; ( s1+1 运算结果是 int 型,需要强制转换类型)
short s1 = 1; s1 += 1; (可以正确编译)
5.位运算符中:&,|,^,~,前三个可以两边都是数字或boolean,~不可为boolean,只能是数字: ~ aInt= -aInt - 1;int a 左移n位(放大)等价于a*2^n,右移n位(缩小)等价于a/2^n.
6.swtch-case
7.声明一个数组的正确形式:int i[][] ; int[][] i; int[] i[];声明当中不可确定具体的数组个数。如以下声明是错误的形式:int i[3][]; int[3] i;int i[3][3]
8.定义一个数组后,数组会自动初始化为相应的类型初始值,int[] a = new int[5];
a[3] = 0; char[] c = new char[5];c[3] = '\u0000'(终端输出时是空白行)。类中方法级的变量必须先初始化。不然不可以使用,哪怕是Sytem.out.println(string)这样的方法。但数组除外,在方法级中可以直接使用,因为JVM会自动先初始化数组,所以是安全的。说到这,涉及到初始化的问题:
e.g.
public class Test {
}
9.调用equals()方法时要注意的地方:如果自定义类时没有overide Object里面的方法equals()那么调用equal()时将默认调用 Object里面的equals().同样,这跟hasCode()和toString()方法也有类似的情况。
e.g.
(1)没有改写equals()方法时:
public class Test {
}
(2)改写equals()方法后:
public class Test {
}
这是为什么呢?难道Ojbect里面的方法equals()就没有实现比较功能吗?我们可以用JDK源代码里看看Object里的equals()是怎样写的:
public boolean equals(Object obj) {
}
//
e.g
public class Test {
}
why? 看看Interger类的源代码就清楚了:
public boolean equals(Object obj) {
}
这个问题对于初学者是最容易搞混的。建议看到类似的程序看看JDK的源代码,我觉得,这时看源代码反而比看帮助文档来得更直接了当,也更容易明白个中源由。