抽象类【关键知识点】
- 被 abstract 修饰的类,无法被实例化,只能被继承,继承抽象类的类可以是普通的实现类也可以是抽象类;
- 如果是实现类,必须实现抽象类的全部方法;
- 如果依然是一个抽象类则不必实现父抽象类的任何方法;
- 抽象类的抽象方法必须加 abstract 关键字与访问控制符,但不能是 private 的,因为子类无法重写 private 方法;
- 抽象类可以包含具体的属性与具体的方法(包括静态的,他毕竟还是个类)
- 可以有构造器,除了无法被实例化,几乎等于普通 Java 类;
- 抽象方法不能有方法体;非抽象方法必须给出默认实现;
接口【关键知识点】
- 被 interface 修饰的类,无法被实例化,用来描述一组类的行为规范(毕竟他不是类,是一组规则),只能被类实现,或被其他接口继承;
- 被实现类实现,并重写全部的方法;
- 被接口继承,允许多重继承(类只能继承一个,接口可以继承多个);
- 访问控制符均为 public 的;
- 可以包含属性,默认均为 static 类型的;
- 方法可以是 static 的,但必须给出方法体 static void method() { }
- 可以有方法体,允许给出默认实现:default void method() { }
对比图
① 抽象类添加抽象方法后必须修改子类,但是接口里面添加抽象方法后允许给出默认实现,可以不修改子类。
② 抽象类的非抽象方法也可以被重写,但是需要手动重写,无法用 IDE 自动导入,当子类调用这个非抽象方法时,若本类不存在,则调用父类的方法。
③ 接口里面的抽象方法若给出了默认实现,子类还是可以继续重写的;但是接口里面的静态方法是无法被重写的。