抽象类与接口_15
抽象类
-
抽象类是 Java 中一种特殊的类,它不能被实例化,通常用于作为其他类的基类。抽象类可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)
-
使用 abstract 关键字修饰的类称为抽象类
-
抽象类可以包含抽象方法和具体方法
-
抽象类不能被实例化,只能被继承
abstract class Animal { // 抽象方法 abstract void makeSound(); // 具体方法 void sleep() { System.out.println("Sleeping..."); } }
抽象方法
- 使用 abstract`关键字修饰的方法称为抽象方法。
- 抽象方法没有方法体(即没有实现),必须在子类中重写。
- 如果一个类包含抽象方法,那么该类必须声明为抽象类。
- 抽象类中可以没有抽象方法
抽象类的特点
- 不能被实例化,抽象类不能直接创建对象,只能通过子类实例化
- 抽象类可以定义抽象方法(必须由子类实现)和具体方法(可以直接使用)
- 如果一个子类继承了一个抽象类,那么它必须实现父类中的所有抽象方法,除非子类也是抽象类
- 抽象类可以定义成员变量,子类可以继承这些变量
- 抽象类中可以有静态成员变量
- 抽象类可以有构造器,用于初始化成员变量或执行其他操作
- abstract只能修饰类和方法,不能修饰属性
- 抽象类中可以有任意成员,因其本身还是个类
- 抽象方法不能用 private、static、final 修饰,因其需被子类重写
抽象类的作用:
- 抽象类通常作为其他类的基类,定义通用的行为和属性
- 抽象类可以包含具体方法,子类可以直接复用这些方法
- 通过定义抽象方法,强制子类实现特定的行为
抽象类最佳实践-模板设计模式
abstract class Beverage {
// 模板方法:定义制作饮料的流程
final void prepareBeverage() {
boilWater(); // 步骤1:烧水
brew(); // 步骤2:冲泡
}
// 具体方法:烧水
void boilWater() {
System.out.println("Boiling water");
}
// 抽象方法:冲泡
abstract void brew();
}
//子类重写brew()方法并调用prepareBeverage()方法即可
接口
接口(interface)是 Java 中一种完全抽象的类型,仅包含方法签名和常量(public static final 修饰)的声明,不包含任何方法的实现
-
使用 interface 关键字定义接口
-
接口中的方法默认是 public abstract 的(即抽象方法)
-
接口中的变量默认是 public static final 的(即常量)
interface Animal { // 抽象方法 void makeSound(); // 抽象方法,默认 public abstract // 常量 String KINGDOM = "Animalia"; // 常量,默认 public static final }
接口的特点
- 接口不能被实例化,只能通过实现类(实现接口的类)来使用
- 接口中的方法默认是 public abstract 的,不需要显式声明
- 接口中的变量默认是 public static final 的,必须初始化
- 一个类可以实现多个接口,从而实现多继承
- Java 8 引入了默认方法(default 方法)和静态方法,允许接口提供方法的默认实现
- 使用 implements 关键字实现接口
- 实现类必须实现接口中的所有抽象方法,除非实现类也是抽象类
- 接口(interface)不能定义任何形式的代码块,包括普通代码块、构造代码块和静态代码块
接口的默认方法
-
Java 8 引入了默认方法,允许接口提供方法的默认实现
-
默认方法使用 default 关键字修饰
-
默认方法可以有方法体(即实现),实现类可以选择重写默认方法,也可以直接使用默认实现
interface Animal { void makeSound(); // 默认方法 default void sleep() { System.out.println("Sleeping..."); } }
-
默认方法的主要目的是在不破坏现有实现类的情况下,向接口中添加新方法
-
如果一个类实现了多个接口,且这些接口中有相同的默认方法,实现类必须重写该方法以解决冲突
-
对于变量也是一样,同理如果继承的类和实现的接口中也有重名的变量或者方法也会编译错误
interface MyInterface01 { int VALUE = 10; // 接口中的常量 } interface MyInterface02 { int VALUE = 10; // 接口中的常量 } class MyClass implements MyInterface01,MyInterface02 { // static int VALUE = 20; public static void main(String[] args) { //System.out.println(VALUE); //编译错误 System.out.println(MyInterface01.VALUE); } }
接口中的静态方法
-
静态方法是在接口中使用 static 关键字定义的方法
-
静态方法属于接口本身,而不是实现类,因此只能通过接口名调用
-
静态方法不能被实现类重写
interface MyInterface { // 静态方法 static void myStaticMethod() { System.out.println("Static method"); } }
抽象类和接口中的一些知识点 |
---|
从 Java 9 开始,接口中可以定义 private 方法,但仍然不能定义 private 常量 |
接口的核心目的是定义公共契约(方法)和全局常量(变量),其成员变量需要被所有实现类访问。使用 private 会违背这一设计 |
实现抽象类和接口中的方法时遵循重写原则,即 方法的返回值和参数列表必须完全相同,Java5后可以使用协变返回类型 允许子类重写父类方法时,返回值类型是父类方法返回值类型的子类型 访问权限不能更严格 异常必须更具体 |
接口不能继承其他类,可以继承多个别的接口 |
接口的修饰符与类一样,只能是public和默认 |
子类可以访问父类的静态变量,如果子类定义了同名静态变量,会隐藏父类的静态变量 |
接口中的常量可以被实现类访问,但不能被重写,如果子类定义了同名静态变量,会隐藏接口的静态变量 |
如果父类或者接口的方法中没有抛出异常,那么子类的重写方法中不能抛出编译时异常,可以抛出运行时异常 |
子类不能抛出不能抛出更宽泛的编译时异常,运行时异常不受限制 |
子类可以不抛出任何异常,即使父类方法中抛出了异常;如果子类方法中抛出异常则需注意不能抛出更宽泛的编译时异常 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!