013 抽象类和接口

本贴最后更新于 2046 天前,其中的信息可能已经东海扬尘

本文为《Java 语言程序设计》第十版 章节笔记

13.1 引言

接口 是为了定义多个类(包括非相关的类)的共同行为。

13.2 抽象类

抽象类(abstract class):一个类设计的非常抽象,以至于它都没有任何具体的实例。

抽象类可以没有抽象方法。抽象类和具体类一样,可以定义具体方法、实例变量等,它和具体类的核心区别是,抽象类不能创建对象

在类头使用 abstract 修饰符表示该类为抽象类。

抽象类和常规类很像,但是不能使用 new 操作符创建它的实例。抽象方法只有定义没有实现,它只是声明了方法,但没有给出方法的实现。它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。

抽象类的构造方法定义为 protected,因为它只被子类使用。

为何要使用抽象类

抽象方法和抽象类看上去是多余的,对于抽象方法,不知道如何实现,定义一个空方法体不就行了吗,而抽象类不让创建对象,看上去只是增加了一个不必要的限制。

引入抽象方法和抽象类,是 Java 提供的一种语法工具,对于一些类和方法,引导使用者正确使用它们,减少被误用。

使用抽象方法,而非空方法体,子类就知道他必须要实现该方法,而不可能忽略。

使用抽象类,类的使用者创建对象的时候,就知道他必须要使用某个具体子类,而不可能误用不完整的父类。

无论是写程序,还是平时做任何别的事情的时候,每个人都可能会犯错,减少错误不能只依赖人的优秀素质,还需要一些机制,使得一个普通人都容易把事情做对,而难以把事情做错。抽象类就是 Java 提供的这样一种机制。

为何要使用抽象类

抽象类的几点说明

  • 抽象方法不能包含在非抽象类中。
  • 抽象类不能使用 new 来初始化。
  • 包含抽象方法的类必须是抽象的。
  • 子类可以覆盖父类的方法并将它定义为 abstract。(少见)
  • 子类的父类是具体的,资格子类也可以是抽象的。
  • 不能使用 new 操作符中一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。

13.5 接口

接口是一个与类相似的结构,只包含常量和抽象方法。

关键字 implements

类和接口之间的关系称为 接口继承(interface inheritance)。

当一个类实现接口时,该类用同样的签名和返回值类型实现定义在接口中的所有方法。

由于接口中所有的数据域都是 public static final ,而且所有的方法都是 public abstract,所以 Java 允许忽略这些修饰符。

13.6 Comparable 接口

Comparable 接口(泛型接口)定义了 compareTo 方法,用于比较对象。

Object 类包含 equals 方法,它的目的就是为了让 Object 类的子类来覆盖它,以比较对象内容是否相同。

13.7 Cloneable 接口

这个接口是空的。一个带空体的接口称为标记接口(marker interface)。一个标记接口即不包含常量也不包含方法。它用来表示一个类拥有某些特定的属性。实现 Cloneable 接口的类标记为可克隆的,而且它的对象可以使用在 Object 类中定义的 clone() 方法克隆。

  • 浅复制(浅克隆)
    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
  • 深复制(深克隆)
    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

13.8 接口与抽象类

一个类可以实现多个接口,但是只能继承一个类。

类型 变量 构造方法 方法
抽象类 无限制 子类通过构造方法链调用构造方法,抽象类不能用 new 实例化 无限制
接口 所有的变量必须是 public ststic final 没有构造方法。接口不能用 new 实例化 所有方法必须是公共的抽象实例方法

13.10 类的设计原则

  • 内聚性
  • 一致性
  • 封装性
  • 清晰性
  • 完整性
  • 实例和静态
  • 继承与聚合
  • 接口和抽象类

END

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...