Java基础 - 抽象类和接口

142 阅读4分钟

抽象类

什么是抽象类?

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类的意义?

为其子类提供一个公共的类型,封装子类中的重复内容,定义抽象方法,子类虽然有不同的实现,但是定义是一致的。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。

抽象类的实现关键字为 abstract class,子类用 extends 关键字继承父类。

抽象类总结:

  1. 抽象类使用 abstract 关键字声明。
  2. 抽象类中可以包含普通方法和抽象方法,抽象方法不能有具体的代码实现。
  3. 抽象类需要使用 extends 关键字实现继承。
  4. 抽象类不能直接实例化。
  5. 抽象类中属性控制符无限制,可以定义 private 类型的属性。

接口

什么是接口?

接口是 Java 语言中的一个抽象类型,用于定义对象的公共行为。它的创建关键字是 interface,在接口的实现中可以定义方法和常量,其普通方法是不能有具体的代码实现的。

一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。

接口的意义?

规范、扩展、回调。

接口总结:

  1. JDK 8 中接口可以定义 static 和 default 方法,并且这两种方法可以包含具体的代码实现。
  2. 实现接口要使用 implements 关键字。
  3. 接口不能直接实例化。
  4. 接口中定义的变量默认为 public static final 类型。
  5. 子类可以不重写接口中的 static 和 default 方法,不重写的情况下,默认调用的是接口的方法实现。

抽象类和接口共同点

  1. 是上层的抽象层。
  2. 都不能被实例化。
  3. 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不提供具体的实现。

抽象类和接口区别

  1. 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势,接口中只能有抽象的方法。
  2. 多继承:一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类,但是一个类可以实现多个接口。
  3. 抽象类可以有默认的方法实现,接口根本不存在方法的实现。
  4. 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明方法的实现。
  5. 构造器:抽象类可以有构造器,接口不能有构造器。
  6. 和普通Java类的区别:除了你不能实例化抽象类之外,抽象类和普通Java类没有任何区别,接口是完全不同的类型。
  7. 访问修饰符:抽象方法可以有public、protected和default修饰符,接口方法默认是public abstrac。你不可以使用其它修饰符。接口中的所有属性默认为:public static final .
  8. main方法:抽象方法可以有main方法并且我们可以运行它,接口没有main方法,因此我们不能运行它。
  9. 速度:抽象类比接口速度要快,接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
  10. 添加新方法:如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。如果你往接口中添加方法,那么你必须改变实现该接口的类。

什么时候用接口,什么时候用抽象类?

  1. 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
  2. 再简单点说,有属性定义的时候,用抽象类,只有方法的时候,用接口。