1、instanceof运算符的陷阱
instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,接口是一种特殊的类),它用于判断前面的对象是否是后面的类或其子类、实现类的实例。如果是,返回true;如果不是,返回false。
使用instanceof运算符有一个限制:instanceof运算符前面操作数的编译时类型必须是如下三种情况:(1) 与后面的类相同;(2) 是后面类的父类;(3) 是后面类的子类。
2、构造器的陷阱
2.1、构造器之前加void
构造器是有返回值的,构造器返回它初始化的Java对象(new调用构造器),其返回值类型总是当前类。
构造器不能声明返回值类型,也不能使用void声明构造器没有返回值。
2.2、创建对象
构造器并不会创建Java对象,构造器只是负责执行初始化,在构造器之前,Java对象所需要的内存空间,应该说是由new关键字申请出来的。
绝大部分时候,程序使用new关键字为一个Java对象申请空间之后,都需要使用要构造器为这个对象执行初始化。但在某些时候无须调用构造器,如:使用反序列化的方式恢复Java对象,使用clone方法复制Java对象。
2.3、无限递归的构造器
无论如何不要导致构造器产生递归调用。应该:
(1) 尽量不要在定义实例变量时指定实例变量的值为当前类的实例;
(2) 尽量不要在初始化块中创建当前类的实例;
(3) 尽量不要在构造器内调用本构造器创建Java对象。
程序示例:
public class Test1 {
Test1 test;
{
test = new Test1();
}
public Test1() {
System.out.println("程序执行无参数的构造器");
}
public static void main(String[] args) {
Test1 test = new Test1();
}
}
3、调用方法
调用方法时传入的实际参数可能被向上转型,通过这种向上转型可以使之符合被调方法的实际需要。
4、方法重写陷阱
private修饰的方法无法重写。
对于不使用访问控制符修饰的方法,它只能被与当前类处于同一个包中的其他类访问,其他包中的子类依然无法访问该方法。若其子类与该类处于同一个包中,子类就可以重写父类的方法;否则,子类将不能重写父类的方法。
5、非静态内部类陷阱
非静态内部类规则:非静态内部类必须寄生在外部类的实例中,没有外部类的对象,就不可能产生非静态内部的对象。
如果程序员为非静态内部类定义一个无参数的构造器,编译器将为之生成对应的需要外部类参数的构造器;程序员为它定义一个带String参数的构造器,编译器将为之生成对应的构造器增加了一个Outer参数。
6、static关键字
static只能用于修饰在类里定义的成员:Field、方法、内部类、初始化块、内部枚举类。static的作用就是把类定义的成员变成静态成员,也就是所谓的类成员。
静态内部类不能访问外部类的非静态成员。