当前位置: 首页 > news >正文

完整教程:Java 抽象(abstract)关键字

完整教程:Java 抽象(abstract)关键字

1. 什么是 abstract 关键字?

abstract 是 Java 中一个非常重要的关键字,中文意思是"抽象的"。它就像一个“未完成的蓝图”或一个“概念模型”,用来定义一些必须存在但暂时无法确定具体实现的东西。

核心思想:

  • 规定必须做什么(What),但不规定具体怎么做(How)。
  • 用于强制子类遵循某种结构或实现特定行为。
  • 提高代码的灵活性和可扩展性,是实现多态和框架设计的基础。

2. 如何理解抽象?一个生动的比喻

想象一下你要造车:

abstract 关键字就是用来编写这份《设计规范》的工具。

3. abstract 修饰类(抽象类)

当一个类被 abstract 修饰时,它就成为了一个抽象类。

3.1 语法与特点

// 使用 abstract 关键字声明一个抽象类
public abstract class Animal
{
// 抽象类可以包含普通字段
private String name;
// 抽象类可以包含普通方法(有具体实现)
public void eat() {
System.out.println("This animal is eating.");
}
// 抽象类可以包含抽象方法(没有方法体)
public abstract void makeSound();
}

3.2 抽象类的核心规则

  1. 不能实例化:你不能使用 new 关键字直接创建一个抽象类的对象。
    Animal myAnimal = new Animal();
    // 编译错误!Animal是抽象的,无法实例化
  2. 必须被继承:抽象类生来就是被当爸爸的。必须有一个子类(可以是普通类,也可以是抽象类)来继承它。
  3. 可以包含混合成员:抽象类里既可以有普通方法(带实现的),也可以有抽象方法(不带实现的),还可以有构造方法、字段等。这是一个与接口的关键区别。

4. abstract 修饰方法(抽象方法)

当一个方法被 abstract 修饰时,它就成为了一个抽象方法。

4.1 语法与特点

public abstract void makeSound();
// 注意:没有方法体{},直接以分号;结束
  • 没有方法体:抽象方法只有方法声明(方法名、参数、返回类型),没有大括号 {} 包裹的实现代码。
  • 必须在抽象类中:一个类如果包含了抽象方法,那么这个类必须被声明为抽象类(abstract class)。
  • 强制子类实现:任何继承了这个抽象类的普通子类必须重写(Override)父类中的所有抽象方法,并提供具体的实现。如果不重写,那么这个子类自己也必须声明为 abstract

5. 代码示例:从抽象到具体

让我们用 Animal 的例子把抽象类和抽象方法串起来。

5.1 定义抽象类和方法

// 抽象类:Animal(动物)
public abstract class Animal
{
private String name;
// 构造方法
public Animal(String name) {
this.name = name;
}
// 普通方法
public void sleep() {
System.out.println(name + " is sleeping. Zzz...");
}
// 抽象方法:动物都会叫,但叫声不同,所以定义为抽象的
public abstract void makeSound();
}

5.2 创建具体子类实现抽象方法

// 具体子类:Dog(狗)
public class Dog
extends Animal {
// 继承抽象类Animal
// 调用父类的构造方法
public Dog(String name) {
super(name);
}
// 必须重写(实现)抽象方法 makeSound()
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}
// 具体子类:Cat(猫)
public class Cat
extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void makeSound() {
// 实现了相同的抽象方法,但行为不同
System.out.println("Meow! Meow!");
}
}

5.3 使用这些类

public class Test
{
public static void main(String[] args) {
// Animal animal = new Animal("Generic Animal"); // 错误!不能实例化抽象类
Animal myDog = new Dog("Buddy");
// 多态:父类引用指向子类对象
Animal myCat = new Cat("Whiskers");
myDog.sleep();
// 输出: Buddy is sleeping. Zzz...
myDog.makeSound();
// 输出: Woof! Woof! (调用的是Dog类的实现)
myCat.sleep();
// 输出: Whiskers is sleeping. Zzz...
myCat.makeSound();
// 输出: Meow! Meow! (调用的是Cat类的实现)
}
}

6. 抽象类 vs 接口

这是一个初学者常见的困惑点。它们在概念上很相似,但有重要区别:

特性抽象类 (Abstract Class)接口 (Interface) (Java 8+)
关键字abstract classinterface
方法可包含抽象方法和具体方法Java 8 前只能有抽象方法,之后可包含 defaultstatic 方法
字段可以有任何类型的字段(普通、静态、常量)字段默认是 public static final(常量)
构造方法构造方法没有构造方法
继承类只能单继承一个抽象类类可以实现多个接口
设计目的“是一个”(IS-A) 关系,表示本质“具有一种能力”(CAN-DO) 关系,表示行为

简单选择原则:

  • 如果你想定义一些对象的基本本质(比如它们都是“动物”),并且需要包含一些公共的实现代码,用抽象类
  • 如果你想定义一些对象可以做什么的契约(比如“可飞行”、“可游泳”),并且不关心它们具体是什么,用接口

7. 总结

希望通过本篇让你对abstract关键字有了更深的理解

http://www.wxhsa.cn/company.asp?id=2461

相关文章:

  • 自建rustdesk服务器,不填写中继地址无法连接的解决
  • Typescript中Type 类型的实现原理
  • 2025.9.13——1黄
  • 数据结构与算法-30.图-拓扑排序
  • 1.进制转化
  • CF1796E Colored Subgraphs
  • 安全加固:启动PostgreSQL 14服务器SSL加密的方法指南在CentOS 7环境中
  • 更美观的网页布局
  • 更灵活易用、延迟超低、更多情感语音支持!地表最强 Voice Agent 开源框架再进化!丨TEN Framework 更新
  • 详细介绍:【干货收藏】Transformer架构深度拆解:大模型入门核心指南
  • 实用指南:Terraform 从入门到实战:历史、原理、功能与阿里云/Azure 上手指南
  • Electron38-Wechat电脑端聊天|vite7+electron38仿微信桌面端聊天系统
  • 详细介绍:开源AI智能客服与AI智能名片在S2B2C商城小程序客服管理中的应用与影响
  • 深入解析:每日一算:电话号码的字母组合
  • PsExec
  • 华为系CEO,正在“接管”汽车圈?
  • Marvell,跌落神坛!
  • 老同志们的93阅兵镜头
  • 英伟达老黄,又收购了一家AI编程公司
  • 读人形机器人10酒店行业
  • 35岁不是终点,而是芯片人的爆发起点!
  • 开源安全与法律争议:OpenSSH枚举、DMCA诉讼与数据泄露事件解析
  • 9.12-huenqi
  • P3983 赛斯石(赛后加强版)踢姐
  • huggingface hub 离线模式
  • 鸿蒙应用开发环境搭建全攻略
  • 深度学习求导原理深度解析
  • ingress 配置说明
  • 场论笔记(二) 单位脉冲函数及其性质
  • MongoDB错误处理【1053】【1067】(意外断开读写中的数据库)