抽象类与接口
抽象方法
- 只有声明,没有具体的实现。
- 必须用
abstract
关键字进行修饰。 - 抽象方法必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下为 public。
抽象类
- 包含抽象方法的类。
- 只是用 abstract 修饰的话也是抽象类。
- 可以拥有成员变量和普通的成员方法。
- 抽象类不能用来创建对象。
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。
接口
- 接口中的变量会被隐式指定为
public static final
变量(只能是),不能被修改且必须有初始值。 - 接口中的方法会被隐式指定为
public abstract
方法。在 Java 8 及以上版本中,接口引入了新的方法类型:default 方法、static 方法和 private 方法。 - 如果一个非抽象类实现了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
区别
- 抽象类中成员变量可以是各种类型的,而接口中的成员变量只能是
public static final
类型的。 - 抽象类可以提供成员方法的实现细节,
而接口中只能存在public abstract
方法。 - 抽象类可以有静态代码块和静态方法,
接口中不能含有静态代码块以及静态方法。 - 一个类只能继承一个抽象类,却可以实现多个接口。
抽象类是对一种事物的抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将“飞行”这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将“飞行”设计为一个接口Fly,包含方法fly(),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。从这里可以看出,继承是一个 "是不是"的关系,而接口实现则是"有没有"的关系。
- ***对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;
而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。***
接口新的方法类型
默认方法(Default Methods)
- 在 Java 8 之前,接口中的所有方法都是抽象的,必须由实现接口的类提供具体实现。然而,有时需要在接口中添加新的方法,但这将破坏现有的实现,因为所有实现该接口的类都需要提供新方法的具体实现。为了解决这个问题,Java 8引入了默认方法。
- 默认方法是接口中带有具体实现的方法,使用
default
关键字修饰。它们允许在接口中提供方法的默认行为,从而可以在不破坏现有实现的情况下向接口添加新方法。
默认方法可以被接口的实现类直接调用,也可以被接口中的其他默认方法调用。
如果实现类提供了与默认方法具有相同签名的方法,则实现类的方法将覆盖接口的默认方法。
默认方法可以调用接口中的其他默认方法或静态方法,但不能直接访问接口的实例变量(因为接口没有实例变量)。
- 默认方法冲突
- 考虑两个包含了同一个方法的接口,如果有一个类同时实现了这两个接口会怎么样呢?Java 编译器会报告这个错误(两个接口如何冲突不重要,至少有一个接口提供了一个默认实现,编译器就会报错),只需在类中覆盖重写这一方法,选择两个冲突方法中的一个。
- 另一种情况,一个类拓展了一个超类,同时实现了一个接口,并从超类和接口继承了相同的方法。这种情况下只会考虑超类方法,接口的所有默认方法都会被忽略。这正是“类优先”原则。
静态方法(Static Methods)
- 有时候,我们需要在接口中提供一些与接口本身相关的工具方法,而不是与接口的实例相关的方法。为了支持这种需求,Java 8引入了接口中的静态方法。
static
方法无法在实现类中被覆盖,只能通过接口名直接调用,类似于类中的静态方法。static
方法通常用于定义一些通用的、与接口相关的工具方法,一般很少用。
私有方法(Private Methods)
- 在Java 9之前,接口中的所有方法都是public和abstract的(除了Java 8 引入的默认方法和静态方法,它们默认是public的)。然而,有时候我们需要在接口中定义一些辅助方法,这些方法不应该被接口的实现类或外部类直接访问。为了支持这种需求,Java 9引入了接口中的私有方法。
- 私有方法是接口中使用
private
关键字修饰的方法。它们可以是静态的,也可以是实例的。
标签:Java,Day8,实现,接口,默认,打卡,方法,抽象类 From: https://blog.csdn.net/SLFG_Ts/article/details/144368656私有方法只能被接口中的其他方法(包括默认方法和静态方法)调用。
它们不能被接口的实现类或外部类直接调用。
私有方法提高了接口的封装性,允许在接口内部实现复用逻辑而不暴露给实现类。