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.mfbz.cn/a/712445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day03 链表概念与单向不循环链表的实现

目录 1、顺序表的优缺点 2、链式存储的线性表 3、单向不循环链表实现 1、顺序表的优缺点 顺序表的优点是: 由于顺序表数据元素的内存地址都是连续的,所以可以实现随机访问,而且不需要多余的信息来描述相关的数据,所以存储密度高。 顺序表的缺点是: 顺序表的数据在进行…

http穿透怎么做?

众所周知http协议的默认端口是80,由于国家工信部要求,域名必须备案才给开放80端口,而备案需要固定公网IP,这就使得开放http80端口的费用成本和时间成本变的很高。那么能不能利用内网穿透技术做http穿透呢?下面我就给大…

git回滚项目至指定版本

用过两种方式 1.使用git命令 进入到项目目录地址,使用git log查看提交版本信息 按q退出 若非对应分支,使用git checkout 分支名 切换分支 这里回退至上一个版本 git reset --hard 版本号 再次推送即可 这里需要使用-f命令 强行推送 2.在pycharm中…

Ps:管理动作和动作组

◆ ◆ ◆ 管理动作 管理“动作” Actions面板中的动作以使其具有条理性,并仅提供项目所需的动作,可以重新排列、复制、删除、重命名和更改动作选项等。 1、重新排列动作中的命令 在“动作”面板中,将命令拖动到同一动作中或另一动作中的新位…

使用gtest做cpp的单元测试并可查看代码覆盖率

前言 由于工作需要,要使用googletest做单元测试,本文记录下搭建gtest单元测试环境,并查看代码覆盖率的方法,以备不时之需。 准备工作 编译gtest 克隆gtest源码: git clone https://github.com/google/googletest.g…

Vue44-创建vue脚手架

一、Vue脚手架的版本说明 vue cli:command line interface 命令行接口工具 用最新的脚手架,这样可以兼容vue3荷vue2版本。 二、通过vue脚手架创建项目 注意: 执行npm run serve 启动项目的时候,要进入到创建的vue项目里面&…

Java高级特性

引言 Java不仅提供了基础的编程功能,还包括了一系列强大的高级特性,这些特性能够显著提高代码的灵活性、可扩展性和性能。本文将详细介绍Java的几个高级特性,包括反射机制、注解与注释、泛型编程、以及Lambda表达式与Stream API,并…

KVM+GFS分布式存储系统构建高可用群集

KVMGFS 分布式存储系统构建 KVM 高可用群集 一:理论概述 1.1:Glusterfs 简介 Glusterfs 文件系统是由 Gluster 公司的创始人兼首席技术官 Anand Babu Periasamy编写。 一个可扩展的分布式文件系统, 用于大型的、 分布式的、 对大量数据进行访…

CrossOver 2024软件安装包下载

CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏,而不需虚拟机。它为Windows软件提供所需的资源,以达到在Mac OS X系统上运行Windows程序的目的。 安 装…

OpenCV形态学

什么事形态学处理 基于图像形态进行处理的一些基本方法; 这些处理方法基本是对二进制图像进行处理; 卷积核决定着图像出来后的效果。 一 图像二值化 什么是二值化 将图像的每个像素变成两种值,如0,255. 全局二值化。 局部二值化。 thres…

【AIGC】MetaGPT原理以及应用

目录 MetaGPT原理 MetaGPT应用 MetaGPT和传统编程语言相比有什么优势和劣势 视频中的PPT 参考资料 MetaGPT原理 MetaGPT是一种多智能体框架,它结合了元编程技术,通过标准化操作程序(SOPs)来协调基于大语言模型的多智能体系统…

商品搬家到抖店

使用的工具为 张飞搬家,登录上去 张飞搬家 1 复制商品的网址 商品链接复制过去后,点击下面的开始批量复制 2 检查修改商品信息 价格啊、图片啊、各种商品属性啊,检查下,不合适的修改和补充 3 开始搬家 4 查看商品 打开抖店后…

数据库基础(一)

目录 一、一些基本概念 1. 四个事务隔离级别 Read Uncommitted(读取未提交内容) Read Committed(读取提交内容) Repeatable Read(可重读) Serializable(可串行化) 2. MVCC&am…

Windows运维:找到指定端口的服务

运维过windows的或多或少都遇到过需要找到一个端口对应的服务,或者是因为端口占用,或者是想看下对应的服务是哪个,那么如何操作呢?看看本文吧。 1、按照端口找到进程ID 例如想找8000端口的进程ID netstat -ano | findstr :8000 2…

大模型算法备案全网最详细说明(附附件)

本文要点:大模型备案最详细说明,大模型备案条件有哪些,《算法安全自评估报告》模板,大模型算法备案,大模型上线备案,生成式人工智能(大语言模型)安全评估要点,网信办大模型备案。 共分为以下几…

【Numpy】一文向您详细介绍 np.floor()

【Numpy】一文向您详细介绍 np.floor() 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本硕,…

【操作与配置】Pytorch环境搭建

安装显卡驱动 显卡驱动是一种软件程序,用于控制显卡硬件与操作系统之间的通信和交互。显卡驱动负责向操作系统提供有关显卡硬件的信息,以及使操作系统能够正确地控制和管理显卡的各种功能和性能。显卡驱动还包含了针对不同应用程序和游戏的优化&#xff…

python生成验证码图片,结合接口供前端调用

🌈所属专栏:【python】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的…

海外仓系统如何让海外仓受益,WMS海外仓系统使用指南

随着跨境电商业务的快速发展,海外仓面临着需要更加高速运转的巨大挑战。 当海外仓出现因为手动作业导致效率低下,成本不断飙升或者出现库存管理问题的时候,意味着是时候引入一套合适的海外仓管理系统了。 对于寻求海外仓业务流程优化的企业…

2779. 数组的最大美丽值

简单翻译一下题目意思: 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数,区间左右是闭的。在每个数字可以替换的前提下,返回数组中最多的重复数字的数量。 第一想法是用一个哈希表,Key 是可以被替换的数…