1. 在类的成员变量中,使用 static 修饰的称作“类变量”, 其他的称作“实例变量”(对象变量)。
实例变量允许在声明时不赋予初值,如果这样做,在类被实例化时其将有默认值 null。
类变量允许在声明时不赋予初值,如果这样做,它将具有默认值 null。
声明一个局部变量(包括基本类型和实例类型)时,如果不赋予初值,则该变量不具有任何默认值,并且无法在对其赋值前对其使用(编译时非法)。
对一个实例变量赋初值为 null 与不对其赋初值是不同的概念。最大的区别在于,在上一行所描述的情况下,如果对一个局部实例变量赋初值 null 则可以在后面使用它。但不可以调用其引用,会抛出空指针异常。
例子:
int foo(){
String s;
if(s == null)
return 1;
else
return 0;
}
这段代码是无法通过编译的,因为对 s 未赋初值,不可以使用它。
int foo(){
String s = null;
if(s == null)
return 1;
else
return 0;
}
上述这段代码则可以通过编译,并且正常运行。
int foo(){
String s = null;
if(s.length() == 0)
return 1;
else
return 0;
}
上述这段代码则将抛出空指针异常。
2. Java中,不带任何字母后缀的数字,默认类型为 double。
3. 参数传递中,基本类型总是传值,实例类型总是传引用。需要注意的是,如果在方法中,形参的引用改变了,那么它就与实参切断了联系。
public class Main {
public static void main(String[] args) {
SubClass subClass = new SubClass(1);
foo(subClass);
System.out.println(subClass.num);
}
static void foo(SubClass s){
s = new SubClass(2);
s.num = 2;
}
}
class SubClass{
int num;
SubClass(int i){
num = i;
}
}
上述代码中,运行结果为 1。因为形参的引用改变后,它的任何修改都与实参无法发生影响。但在引用改变前做的修改都将生效。
4. 在二元运算中,如果操作数都为整型,只要其中有一个为long型,则表达式结果为long型,否则都为int型。包括其中有1或2个 char、byte、short、int参与的运算。例如(byte + byte)其结果也为int型。
如果操作数有浮点型,则如果有double,结果为 double 类型。否则都为 float 类型。
5. 字符串的(连续) “+” 号表达式中,如果第一个操作数为字符串类型,则后续所有操作数都将独立作为字符串类型操作。而如果其中字符串类型的操作数不在第一个,在其之前的操作数将按照其本身类型进行加法运算和类型转换。
例如:1 + 2 + 3 + “hello”,其结果为“6hello”
而:“hello” + 1 + 2 + 3,其结果为“hello123”
所以,为了避免以后出现类似的错误,仅进行字符串拼接时,最好在最前面加上空字符串操作符:
“” + 1 + 2 + 3 + “hello” ----> “123hello”
6. 对象的 equals() 都继承自 Object 类,在 Object 类中,equals() 方法默认实现为 “this == object”,比较的是两个变量引用的是否为同一个对象。所以在未改写 equals() 的对象调用此方法时需注意。
7. 逻辑表达式的 “短路”特性。一个复杂逻辑表达式中,按优先级高到低,如果某个逻辑值可以代表整个表达式的结果时,则后续表达式将不被求值,即不会被执行。
8. 移位运算符:<<、>>、>>>
<<:算数左移,低位以0补充,相当于乘2
>>:算数右移,高位以原来的高位补充,相当于除以2取商
>>>:逻辑右移 ,高位以0补充
上述的算数,是以补码形式进行计算的。