区别
抽象类 | 接口 |
---|---|
有构造器,但是不能被实例化 | 没有构造器,也不能被实例化 |
无默认类型;JDK7之前只能有 abstract 方法,即空方法体;JDK8 开始接口中可以使用 default、static方法;JDK9开始接口中可以使用 private方法 | 默认方法类型为 public abstract |
无默认类型,可以有非 psf 类型字段 | 默认字段类型为 public static final |
注意:
- 接口可以理解为是对抽象类的进一步抽象,它是一种“规范” -> 方便我们面向接口编程(同一套接口,可以有不同的实现方式。eg:jDBC接口 -> 多种数据库厂商自己实现自己的实现类)
- 可以在接口和具体类之间“加一层”抽象类,提取这些具体类的公共的“需要实现的方法”(eg:Map -> AbstractMap -> HashMap, TreeMap )
抽象类
-
有构造器,但是不能被实例化
public abstract class Person { private String name; // 抽象类可以有构造器 public Person() { } public Person(String name) { this.name = name; } public abstract void show(); @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } public static void main(String[] args) { // 抽象类不可以被实例化 // 'Person' is abstract;can not be instantiated // Person person = new Person(); // 匿名内部类(必须实现里面的abstract方法) -> 本质上仍然是调用子类实现类 Person person = new Person() { @Override public void show() { System.out.println("调用show方法"); } }; System.out.println(person); // Person{name='null'} } }
接口
-
没有构造器,也不能被实例化
public interface Action { // 接口不能有构造器. // public Action() {} }