java-抽象类和抽象方法1

## Java中的抽象类和抽象方法

### 1. 抽象类的基本概念

在Java中,抽象类(Abstract Class)是用来声明一个类不完整,不能被实例化的。抽象类通常用作其他类的基类,为子类提供统一的接口和部分实现。抽象类使用`abstract`关键字进行声明,并且可以包含抽象方法和具体方法。

抽象类的主要目的是通过将公共行为和属性集中在基类中,提供代码复用和统一接口的好处,同时允许子类提供具体的实现。

#### 抽象类的定义

```java
abstract class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    // 抽象方法
    abstract void makeSound();

    // 具体方法
    void sleep() {
        System.out.println(name + " is sleeping.");
    }
}
```

在上述代码中,`Animal`类是一个抽象类,包含一个抽象方法`makeSound`和一个具体方法`sleep`。抽象方法没有方法体,由子类提供具体实现。

### 2. 抽象方法的基本概念

抽象方法(Abstract Method)是没有方法体的方法,只能在抽象类中声明,由子类实现。抽象方法使用`abstract`关键字进行声明,且不能包含大括号和方法体。

#### 抽象方法的定义

```java
abstract class Animal {
    // 抽象方法
    abstract void makeSound();
}
```

在上述代码中,`makeSound`方法是一个抽象方法,只有方法签名,没有方法体。子类必须重写(Override)这个方法,并提供具体的实现。

### 3. 抽象类和抽象方法的实现

抽象类和抽象方法的主要特点和实现如下:

#### 3.1 抽象类不能实例化

抽象类不能直接创建实例,只能通过子类实例化。例如:

```java
abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        // Animal animal = new Animal(); // 错误,无法实例化抽象类
        Animal dog = new Dog();
        dog.makeSound(); // 输出:Dog barks.
    }
}
```

在上述代码中,不能直接实例化`Animal`类,只能通过`Dog`类实例化并调用`makeSound`方法。

#### 3.2 子类必须实现抽象方法

如果一个类继承了抽象类,则必须实现所有抽象方法,除非该子类也是抽象类。例如:

```java
abstract class Animal {
    abstract void makeSound();
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks.");
    }
}

abstract class Bird extends Animal {
    // 子类Bird也是抽象类,不需要实现makeSound方法
}

class Sparrow extends Bird {
    @Override
    void makeSound() {
        System.out.println("Sparrow chirps.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.makeSound(); // 输出:Dog barks.

        Animal sparrow = new Sparrow();
        sparrow.makeSound(); // 输出:Sparrow chirps.
    }
}
```

在上述代码中,`Dog`类实现了`makeSound`方法,而`Bird`类虽然继承了`Animal`类,但它自身是抽象类,因此可以不实现`makeSound`方法。最终,由具体的子类`Sparrow`实现`makeSound`方法。

#### 3.3 抽象类可以包含具体方法

抽象类不仅可以包含抽象方法,还可以包含具体方法,为子类提供通用功能。例如:

```java
abstract class Animal {
    abstract void makeSound();

    void sleep() {
        System.out.println("This animal is sleeping.");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Cat meows.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal cat = new Cat();
        cat.makeSound(); // 输出:Cat meows.
        cat.sleep(); // 输出:This animal is sleeping.
    }
}
```

在上述代码中,`Animal`类包含一个具体方法`sleep`,所有继承`Animal`类的子类都可以直接使用这个方法,而无需重新实现。

#### 3.4 抽象类可以有构造函数

尽管抽象类不能实例化,但它们可以有构造函数,供子类调用。例如:

```java
abstract class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    abstract void makeSound();

    void displayInfo() {
        System.out.println("This is a " + name);
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    @Override
    void makeSound() {
        System.out.println("Dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("Bulldog");
        dog.displayInfo(); // 输出:This is a Bulldog
        dog.makeSound(); // 输出:Dog barks.
    }
}
```

在上述代码中,`Animal`类有一个构造函数,用于初始化`name`字段。`Dog`类通过`super`关键字调用父类的构造函数。

### 4. 抽象类的设计和使用场景

抽象类在设计模式和软件架构中有广泛的应用,尤其在以下场景中:

#### 4.1 定义模板方法

模板方法模式是一种行为型设计模式,其中抽象类定义了一个算法的框架,并将某些步骤延迟到子类中实现。例如:

```java
abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    // 模板方法
    public final void play() {
        initialize();
        startPlay();
        endPlay();
    }
}

class Cricket extends Game {
    @Override
    void initialize() {
        System.out.println("Cricket Game Initialized.");
    }

    @Override
    void startPlay() {
        System.out.println("Cricket Game Started.");
    }

    @Override
    void endPlay() {
        System.out.println("Cricket Game Ended.");
    }
}

class Football extends Game {
    @Override
    void initialize() {
        System.out.println("Football Game Initialized.");
    }

    @Override
    void startPlay() {
        System.out.println("Football Game Started.");
    }

    @Override
    void endPlay() {
        System.out.println("Football Game Ended.");
    }
}

public class Main {
    public static void main(String[] args) {
        Game game = new Cricket();
        game.play(); // 输出:Cricket Game Initialized. -> Cricket Game Started. -> Cricket Game Ended.

        game = new Football();
        game.play(); // 输出:Football Game Initialized. -> Football Game Started. -> Football Game Ended.
    }
}
```

在上述代码中,`Game`类定义了一个模板方法`play`,具体步骤由子类`Cricket`和`Football`实现。

#### 4.2 定义接口的一部分实现

在某些情况下,抽象类可以为接口的实现提供部分实现,而子类只需实现剩余的部分。例如:

```java
interface AnimalBehavior {
    void eat();
    void sleep();
}

abstract class Animal implements AnimalBehavior {
    @Override
    public void sleep() {
        System.out.println("This animal is sleeping.");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("Dog is eating.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.eat(); // 输出:Dog is eating.
        dog.sleep(); // 输出:This animal is sleeping.
    }
}
```

在上述代码中,`Animal`类实现了接口`AnimalBehavior`的`sleep`方法,而`Dog`类只需实现`eat`方法。

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

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

相关文章

leetcode打卡#day46 322. 零钱兑换、279. 完全平方数、139. 单词拆分

322. 零钱兑换 class Solution { public:int coinChange(vector<int>& coins, int amount) {//min countvector<int> dp(amount1, INT_MAX);int n coins.size();//initdp[0] 0;//不包含顺序, 先物品再容量for (int i 0; i < n; i) {for (int j coins[i…

免费个人站 独立站 wordpress 自建网站

制作免费网站 | 免费网站构建器 | WordPress.com https://bioinformatics7.wordpress.com WordPress.com

【总线】设计fpga系统时,为什么要使用总线?

目录 为什么用总线 为什么选择AMBA 总结 系列文章 【总线】AMBA总线架构的发展历程-CSDN博客 【总线】设计fpga系统时&#xff0c;为什么要使用总线&#xff1f;-CSDN博客 【总线】AMBA总线家族的明星成员&#xff1a;AXI协议简介-CSDN博客 为什么用总线 在FPGA系统设计…

【Python安装教程】2024年最新版Python环境搭建及模块安装,保姆教程,手把手操作,不信你还不会!

前言 Python 可应用于多个平台&#xff0c;如 Windows 、 Linux 和 MacOS 。 如何检测电脑是否安装了Python&#xff1f; 按键盘winR键&#xff0c;打开运行框。输入CMD&#xff0c;回车确定。输入where Python后回车&#xff0c;如有安装则会显示Python的安装位置。如未安装…

原码、反码和补码

原码 原码是数字的二进制表示方式&#xff0c;由符号位和绝对值&#xff08;数值位&#xff09;构成。原码的第一位代表符号位&#xff08;0 代表正数&#xff0c;1 代表负数&#xff09;&#xff1b;第二位开始就是数字的绝对值。 反码 反码的表示方法区分正负数。 正数时…

欧洲杯德语词汇与表达,柯桥零基础德语培训

欧洲杯 - die Europameisterschaft 足球 - der Fuball 比赛 - das Spiel / die Partie 球员 - der Spieler 教练 - der Trainer 裁判 - der Schiedsrichter 球迷 - die Fans 进球 - das Tor 守门员 - der Torwart / der Torhter 前锋 - der Strmer 中场 - der Mittelf…

C语言经典指针运算笔试题图文解析

指针运算常常出现在面试题中&#xff0c;画图解决是最好的办法。 题目1&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&…

安装包的方式安装哪吒agent被控端(黑群晖也一样)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 前几天&#xff0c;收了台服务器&#xff0c;16核16G的&#xff0c;价格也不贵&#xff0c;之前我记得发过文章推荐过&#xff0c;这几天搞了搞&#xff0c;性能还不错&#xff0c;…

javaWeb项目-ssm+jsp学生请假系统功能介绍

本项目源码:java-ssm-jsp学生请假系统源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL…

文章MSM_metagenomics(一):介绍

介绍 欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 用于复现Huang et al. [huang2024establishment]研究分析的计算工作流程&#xff0c;所有复…

笨蛋学算法之LeetCodeHot100_1_两数之和(Java)

package com.lsy.leetcodehot100;public class _Hot1_两数之和 {//自写方法public static int[] twoSum1(int[] nums, int target) {//定义存放返回变量的数组int[] arr new int[2];//遍历整个数组for (int i 0; i < nums.length; i) {//从第二个数开始相加判断for (int j…

LLM 学习之「向量数据库」

LLM 学习之「向量数据库」 什么是向量数据库&#xff1f; 向量数据库是一种以向量或数据点的数学表示形式存储数据的数据库。 人工智能和机器学习使非结构化数据能够转换为捕获意义和上下文的数字表示&#xff08;向量&#xff09;&#xff0c;这得益于自然语言处理和计算机视…

阿里云系列产品免费用,不香吗?

阿里云系列产品免费用&#xff0c;不香吗&#xff1f; 什么是无影云电脑开启无影云下载安装客户端登录无影云桌面应用场景 开篇先发布一下阿里云产品免费体验地址&#xff1a;https://free.aliyun.com/?utm_contentg_1000370296 下面开始我的无影云电脑或者叫做无影云桌面的体…

Anaconda环境安装失败的解决方案

链接步骤的补充。 为了运行marlib&#xff0c;需要一个全新的Anaconda环境。但是&#xff0c;不想把文件安装在C盘&#xff0c;会造成空间不足。于是试着在.condarc文件里面改动了路径&#xff0c;具体如图。 上图中&#xff0c;在defaults前面添加了D盘的路径作为安装路径。 …

微型操作系统内核源码详解系列五(1):arm cortex m3架构

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

【秋招突围】2024届秋招笔试-小红书笔试题-第一套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

React 懒加载源码实现

懒加载 React 中懒加载是一种按需加载组件的机制&#xff0c;有些组件不需要在页面初始化就进行加载&#xff0c;这些组件可以按需加载&#xff0c;当需要时再进行加载。懒加载是怎么实现的呢&#xff1f;如果要实现一个懒加载功能应该怎么去做呢&#xff1f;可以通过异步动态…

小阿轩yx-Apache 网页优化

小阿轩yx-Apache 网页优化 网页压缩与缓存 对Apache服务器优化配置 能让 Apache 发挥出更好的性能 相反&#xff0c;配置糟糕 Apache可能无法正常服务 网页压缩 网站的访问速度是由多个因素所共同决定的 包括应用程序 响应速度网络带宽服务器性能与客户端之间的网络传…

Web 前端开发的就业前景好吗?适合的学习人群有哪些?

Web 前端开发的就业前景好吗&#xff1f;适合的学习人群有哪些&#xff1f; 相信很多想要或正在犹豫要不要学习前端的同学们都会有以下这些疑问“关于 Web 前端 的开发前景好吗&#xff1f;”、“适合的学习人群有哪些&#xff1f;”想要学习 Web 前端开发的同学们来和小编一起…

2024最值得入手骨传导耳机指南,精选五款分享!

作为前几年在蓝牙耳机市场杀出的一匹黑马&#xff0c;黑科技加持的骨传导耳机受到广大运动爱好者的喜爱。利用骨传导技术&#xff0c;通过头骨、颌骨把声音传到听觉神经引起听觉&#xff0c;同时又不阻碍外接声音的通过&#xff0c;保证了佩戴的舒适性也带来安全使用的最佳体验…