[Amazon] Abstract Class 与 Anonymous Class

这是我面Amazon Intern的其中一个问题,  当时是解释什么是Abstract class, 我啪啦啪啦的说了一堆, 其中就说, 我们一般不实例化抽象类, 因为其中有抽象方法, 抽象方法会让实例变得毫无意义, 我的原话是meaningless, 这里的毫无意义是因为实例就是拿去直接用的, 然而其中如果有抽象方法, 说明这个实例是不完整的. 当时印度小哥立刻就问完, 你说抽象类能实例化么? 我说能的. 然后Amazon就那么离我而去了.

Talk is cheap. Show me the code

public abstract class Car {
    public int getAge(){
        return  5;
    }
    public static void main(String[] args) {
        Car mycar = new Car(){};
        System.out.println(mycar.getAge());
        LinkedList list = new LinkedList();
    }
}

Car是一个抽象类, 我下面的main方法初始化了它. 是不是可以? 上面的code是无错的,而且跑的飞快.

上面的code有两个tricks:

  1. Car虽然是抽象类, 但是没有抽象方法, 所以它不是那么的”抽象”.
  2. 初始化Car的时候, 我用了Anonymous Class类初始化它, 并且Car又没有抽象的方法, 所以这个初始化是可以的.

其中匿名类初始化我们在做Comparator的时候经常使用, 只是里面的compare方法是抽象的,每次使用都需要定义一下, 而这里, Car中没有抽象方法, 所以就可以被当做匿名类初始化.

Again: 以上的代码并不和”抽象类不能实例化”冲突.