类与接口

szza / 2023-08-21 / 原文

抽象类和接口的对比:

抽象类是用来捕捉子类的通用特性的。

接口是抽象方法的集合。 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象, 是一种行为的规范。

相同点:

• 接口和抽象类都不能实例化

• 都位于继承的顶端,用于被其他实现或继承

• 都包含抽象方法,其子类都必须覆写这些抽象方法

不同点:

参数 抽象类 接口
实现 抽象类使用abstract关键字声明 接口使用interface关键字修饰
构造器 子类使用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法实现 子类使用implements关键字来实现接口,它需要提供接口中的所有声明的方法的实现
访问修饰符 抽象类可以有构造器 接口不能有构造器
访问修饰 抽象类中的方法可以使任意访问修饰符 接口方法默认修饰符是public,并且不允许定义为private或者protected
多继承 一个类最多只能继承一个抽象类 一个类可以实现多个接口
字段声明 抽象类的字段声明可以是任意的 接口的字段默认都是static和final的
备注:Java8 中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间 的差异。 现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。

接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:

• 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接 口,尽量少用抽象类。

.• 选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提 供通用的功能。 普通类和抽象类有哪些区别?

• 普通类不能包含抽象方法,抽象类可以包含抽象方法。 • 抽象类不能直接实例化,普通类可以直接实例化。

抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继 承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

创建一个对象用什么关键字?对象实例与对象引用有何不同?

new 关键字,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实 例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根 绳子可以不系气球,也可以系一个气球);一个对象可以有 n 个引用指向它(可 以用 n 条绳子系住一个气球)。