学习Java41天

抽象类 (Abstract Class)

一、抽象类的基本概念

1. 抽象方法
  • 定义:一个没有方法体的方法(即只有方法声明,没有具体的实现)。

  • 格式

    java

    public abstract 返回值类型 方法名(参数列表);
  • 特点

    • 使用abstract关键字修饰。

    • 没有方法体,直接以分号;结束。

    • 它定义了一个“必须实现”的规范或契约

2. 抽象类
  • 定义:包含抽象方法的类必须被声明为抽象类。

  • 格式

    java

    public abstract class 类名 { // 类的内容 }
  • 特点

    • 使用abstract关键字修饰类。

    • 抽象类不能直接实例化(不能new抽象类)。

二、抽象类的作用与设计思想

抽象类的核心是一种“未完成”的类设计模板

  1. 抽取共性,定义规范

    • 当在父类中提取多个子类的共性行为时,如果无法(或不适合)确定该行为的具体实现,就将该方法声明为抽象方法

    • 这样,抽象类就定义了一个“规范”或“契约”,强制所有非抽象的子类必须按照这个声明来提供具体的实现。

  2. 强制子类重写

    • 子类继承抽象类后,必须处理这些抽象方法。这保证了代码的一致性。

通俗理解:抽象类就像是制定了一份“必须完成的任务清单”。清单上只写了任务名称和要求(抽象方法),但没写怎么做。子类就像不同的执行者,它们必须按照清单完成所有任务(实现所有抽象方法),但可以根据自己的情况选择不同的完成方式。

三、继承抽象类的注意事项

当一个普通类继承一个抽象类时,有两种选择:

  1. 重写所有抽象方法(推荐,也是最常见的情况)

    • 将父类中定义的所有抽象方法都提供具体的实现。

    • 这样,子类就成为了一个“具体类”,可以被正常实例化。

  2. 将自己也声明为抽象类

    • 如果子类没有重写没有重写全部的抽象方法,那么这个子类也必须abstract关键字修饰,成为一个新的抽象类。

    • 这个新的抽象类可以继续被其他类继承。

简单总结“抽象”具有传递性。一个类只要继承了抽象方法而没有实现它,它自己就必须保持抽象。

四、抽象类的其他特性

  1. 抽象类中可以有构造方法

    • 虽然抽象类不能直接实例化,但它可以有构造方法

    • 构造方法用于子类创建对象时,初始化从父类继承来的成员。

    java

    public abstract class Animal { private String name; // 抽象类可以有构造方法 public Animal(String name) { this.name = name; } public String getName() { return name; } public abstract void eat(); }
  2. 抽象类中不一定有抽象方法

    • 一个类被abstract修饰,它就是抽象类。

    • 但抽象类不一定包含抽象方法。这种设计通常是为了防止这个类被实例化,而只允许它被继承。

    java

    public abstract class MyBaseClass { // 没有抽象方法,但类依然是抽象的 public void normalMethod() { System.out.println("这是一个普通方法"); } } // 这个类不能 new MyBaseClass(),只能被继承。
  3. 抽象类中可以包含普通成员

    • 抽象类可以有普通的成员变量普通的成员方法(非抽象方法)

    • 这些普通成员可以直接被子类继承和使用。

五、完整示例

java

// 1. 定义抽象类 public abstract class Animal { private String name; private int age; // 抽象类可以有构造方法 public Animal(String name, int age) { this.name = name; this.age = age; } // 抽象方法:定义了一个必须完成的行为规范 public abstract void eat(); // 普通方法:子类可以直接继承使用 public void sleep() { System.out.println(name + "正在睡觉"); } // Getter/Setter public String getName() { return name; } public int getAge() { return age; } } // 2. 具体子类:必须重写所有抽象方法 public class Cat extends Animal { public Cat(String name, int age) { super(name, age); // 调用父类构造方法 } @Override public void eat() { System.out.println(getName() + "(" + getAge() + "岁)正在吃鱼"); } } // 3. 另一个具体子类 public class Dog extends Animal { public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(getName() + "(" + getAge() + "岁)正在啃骨头"); } // 子类可以有自己的特有方法 public void watchHouse() { System.out.println(getName() + "在看家"); } } // 4. 测试类 public class Test { public static void main(String[] args) { // Animal a = new Animal(); // 错误!抽象类不能实例化 Animal cat = new Cat("小花", 2); cat.eat(); // 输出:小花(2岁)正在吃鱼 cat.sleep(); // 输出:小花正在睡觉 Dog dog = new Dog("大黄", 3); dog.eat(); // 输出:大黄(3岁)正在啃骨头 dog.watchHouse(); // 输出:大黄在看家 } } // 5. 抽象子类示例(不重写抽象方法) public abstract class Bird extends Animal { // 没有重写 eat() 方法,所以 Bird 也必须是抽象类 public Bird(String name, int age) { super(name, age); } // 可以定义新的抽象方法 public abstract void fly(); } // 6. 最终的具体类,需要实现所有抽象方法(包括Animal的和Bird的) public class Sparrow extends Bird { public Sparrow(String name, int age) { super(name, age); } @Override public void eat() { // 实现 Animal 的 eat() System.out.println(getName() + "正在吃虫子"); } @Override public void fly() { // 实现 Bird 的 fly() System.out.println(getName() + "正在飞翔"); } }

六、抽象类 vs 普通类 vs 接口

特性普通类抽象类接口
实例化可以直接实例化不能直接实例化不能直接实例化
方法全是具体方法可以有具体方法和抽象方法Java 8前全是抽象方法,之后可以有默认/静态方法
构造方法没有
成员变量任意类型任意类型只能是public static final常量
继承/实现单继承单继承多实现
设计目的具体实现模板设计,部分实现,部分规范纯规范,定义行为契约

七、总结

  1. 抽象类是一个“半成品”类,它定义了部分实现,也声明了部分必须由子类完成的规范(抽象方法)。

  2. 核心作用代码复用 + 强制规范。既提取了共性代码,又强制子类必须实现特定行为。

  3. 使用场景:当多个相关类有共同的属性和行为,但某些行为的具体实现各不相同时。

  4. 设计理念:“面向抽象编程”,依赖于抽象(父类或接口)而非具体实现,提高了代码的灵活性和可扩展性。

package abstract02; public class Test { public static void main(String[] args) { Frog f = new Frog(1, "wawa"); System.out.println(f.getName()+", "+f.getAge()); f.drink(); f.eat(); f.swim(); Dog d = new Dog(5, "wangwang"); System.out.println(d.getName()+", "+d.getAge()); d.drink(); d.eat(); d.swim(); Sheep s = new Sheep(6, "miemie"); System.out.println(s.getName()+", "+s.getAge()); s.drink(); s.eat(); } } package abstract02; public abstract class Animal { private String name; private int age; public Animal() { } public Animal(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void drink(){ System.out.println("动物在喝水"); } public abstract void eat(); } package abstract02; public class Dog extends Animal implements Swim{ public Dog() { } public Dog(int age, String name) { super(age, name); } @Override public void eat() { System.out.println("狗在吃骨头"); } @Override public void swim() { System.out.println("狗在游泳"); } } package abstract02; public class Frog extends Animal implements Swim{ public Frog() { } public Frog(int age, String name) { super(age, name); } @Override public void eat() { System.out.println("青蛙在吃虫子"); } @Override public void swim(){ System.out.println("青蛙在游泳"); } } package abstract02; public class Sheep extends Animal{ public Sheep() { } public Sheep(int age, String name) { super(age, name); } @Override public void eat() { System.out.println("🐏在吃草"); } } package abstract02; public interface Swim { public abstract void swim(); }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024美团_京东Hive面试真题解析:原理+实战+优化,附详细答案

2024美团/京东Hive面试真题解析:原理实战优化,附详细答案 一、引言:从面试场景到核心能力 你坐在美团的面试间里,面前的面试官放下简历,推过来一道题: “为什么Hive查询慢?从原理到优化&#xf…

27考研记录数据结构以及一元函数微分学的学习记录

作为科班的学生,已经学习过了数据结构和计算机网络,但是作为408 的知识,之前学习会有一些浅显,现在在王道的哔站中进行复习,但是 之前并没有学习过计算机组成原理,听说这个挺难学的,之后还有进行 学习,今天对于…

Flutter for OpenHarmony移动数据使用监管助手App实战 - 帮助实现

Flutter for OpenHarmony移动数据使用监管助手App实战 - 帮助实现

深度学习毕设项目:基于python-CNN机器学习卷积神经网络的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

【课程设计/毕业设计】基于python-CNN机器学习卷积神经网络对不同柑橘病变识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Flutter入门:打包

一般运行/调试后,会出现这个文件: build/app/outputs/apk/flutter-apk/app-debug.apk这个apk不能直接安装在安卓手机。 需要运行: flutter build apk --release --split-per-abi --target-platform android-arm,and…

RHCSA(2)

一.作业要求作业需求查看文件文件查找查找文件中包含字符串ro的所有行,将所有行的副本按原始顺序放在文件中将目录下的文件打包并压缩写一个命令命为hello命令创建组群,再创建用户,并写出该命令创建g1组,要求创建一个属…

PDF Eraser Pro 2.0 PDF Eraser:支持文本 图像精准擦除,可添加文字图片,适配办公、学习等 PDF 轻编辑场景

大家好,我是大飞哥。处理PDF文件时,我们常遇到无法精准删除内容、编辑功能单一、操作繁琐的痛点——传统PDF工具要么仅支持简单文本修改,要么删除后易留痕迹,难以适配“精准擦除补充编辑”的需求。PDF Eraser是一款聚焦PDF内容精准…

【课程设计/毕业设计】基于深度学习python-CNN卷积神经网络的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

Flutter开发环境:VS Code + Android Studio

https://www.botaokeji.net/基于vs-code及android-studio的flutter移动应用开发环境配置教程/

深度学习毕设选题推荐:基于python-CNN卷积神经网络人工智能的不同衣服颜色识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026最新版的小程序公司十大榜单排名!哪家更受欢迎呢? - 企业数字化改造和转型

随着移动互联网生态持续深化,小程序凭借“无需下载、即用即走”的核心优势,已成为企业数字化转型的必备载体。据QuestMobile数据显示,2025年中国小程序生态市场规模突破3.2万亿元,开发服务市场规模达920亿元,预计…

Java语言提供了八种基本类型。六种数字类型【函数那些1】

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 因此,通过定义不同类型的变量,可以在内存中储存整…

LeeCode_19 删除链表的倒数第n个节点

19.删除链表的倒数第n个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1:输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] /*** Definition for singly-linked list.* struct ListNo…

救命神器8个AI论文网站,本科生搞定毕业论文不求人!

救命神器8个AI论文网站,本科生搞定毕业论文不求人! AI 工具让论文写作不再难 对于本科生来说,毕业论文无疑是大学生活中最具挑战性的任务之一。从选题、查资料到撰写、修改,每一步都可能让人感到焦虑和无力。而如今,随…

MATLAB:一种超声图像的运动分析方法(块匹配法)

0 引言 心血管疾病( cardiovascular diseases,CVD)危险因素对居民健康的影响愈加显著,CVD 的发病率仍持续增高。 CVD 给居民和社会 带来的经济负担日渐加重,已成为重大的公共卫生问题,已成为危害各国人民健康的三大疾病之一,其患病率和死亡率居于全球之首…

微信小程序要怎么做?哪家公司可以做?2026最全教程分享 - 企业数字化改造和转型

作为深耕小程序开发领域8年的老兵,我经手过几百个从0到1的小程序项目,不管是个体户想做线上门店,还是企业搭建私域载体,最实用的路径其实是借助成熟的小程序制作平台——不用懂代码,成本可控,还能快速上线。毕竟…

Java语言提供了八种基本类型。六种数字类型【函数艾弗森】

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 因此,通过定义不同类型的变量,可以在内存中储存整…

异地恋不慌!Like_Girl 情侣纪念站可以用cpolar把爱意存进云端随时看

Like_Girl v5.2.0 作为专为情侣打造的纪念网站系统,核心功能贴合情侣日常记录需求:恋爱计时器精准到秒记录相伴时光,留言板可留存日常甜蜜对话,恋爱相册能收纳合照与心动瞬间,还有恋爱清单、点点滴滴等板块定格回忆&am…

Win11怎么关闭自动更新_Win11禁用系统更新详细步骤,禁止windows系统更新的软件工具

Win11怎么关闭自动更新_Win11禁用系统更新详细步骤【教程】 Windows系统的自动更新功能本来是好意,能帮我们及时安装安全补丁和新功能。但实际用起来,不少人却被它搞得头大: 正忙着工作呢,突然弹出更新提示,打断思路…