Java 抽象类和接口

一、抽象类和接口定义和使用场景

        当你需要设计一些类,这些类有一些属性和方法是可以共享的,但同时又有一些属性和方法是需要不同的。在这种情况下,Java中提供了两种不同的机制,即“抽象类”和“接口”。

        抽象类是一个类,它不能被实例化,而是需要被子类继承。抽象类可以包含抽象方法,这些方法没有具体的实现,只有方法名。当然,抽象类中也可以包含具有实现的方法。子类继承抽象类时,必须实现抽象方法,否则子类也必须标记为抽象类。

        接口也是一种抽象类,但它只包含常量和抽象方法的定义。所有接口方法都是抽象的,没有实现部分。类可以实现一个或多个接口,这意味着类必须实现接口中定义的所有方法。接口提供了一种使用多态性编程的方法,即使不知道对象属于哪个类,也可以调用对象的方法。

        总的来说,抽象类和接口都可以用来为类提供共享的属性和方法。抽象类允许具体方法而接口则只有抽象方法。如果你需要为一组相关的类提供通用的属性和方法,你应该选择抽象类。如果你需要实现多态性或在不同的类中实现相同的方法,你应该选择接口。

二、注意点

        抽象类中可以有实现方法。抽象类中可以包含有具体实现的方法,这些方法可以在子类中继承和使用,也可以在抽象类本身中调用使用。抽象类中的具体实现方法可以在子类中被重写或者继承,也可以被子类调用或者使用。在抽象类中定义具体实现方法可以为子类提供一些共性的方法,用于子类继承和调用,从而简化了子类的实现。

以下是Java的一个抽象类和接口的示例代码:

//抽象类定义 shape
abstract class Shape {
    protected int x, y;
    public void move(int x, int y) {
        this.x = x;
        this.y = y;
    }
    public abstract void draw();
}

//接口定义 Polygon
interface Polygon {
    public void getNumberOfSides();
}

//Triangle 继承 Shape,实现 Polygon
class Triangle extends Shape implements Polygon {
    private int sides = 3;
    public void draw() {
        System.out.println("Drawing Triangle...");
    }
    public void getNumberOfSides() {
        System.out.println("Number of sides: " + sides);
    }
}

//Rectangle 继承 Shape,实现 Polygon
class Rectangle extends Shape implements Polygon {
    private int sides = 4;
    public void draw() {
        System.out.println("Drawing Rectangle...");
    }
    public void getNumberOfSides() {
        System.out.println("Number of sides: " + sides);
    }
}

//主函数类
public class Main {
    public static void main(String[] args) {
        //Shape 形状1
        Shape shape1 = new Triangle();
        shape1.move(10, 20);
        shape1.draw();
        Polygon poly1 = new Triangle();
        poly1.getNumberOfSides();
        //Shape 形状2
        Shape shape2 = new Rectangle();
        shape2.move(50, 100);
        shape2.draw();
        Polygon poly2 = new Rectangle();
        poly2.getNumberOfSides();
    }
}

在以上代码中,Shape 类是抽象类,Polygon 接口具有 getNumberOfSides 方法。Triangle 类和 Rectangle 类都继承了 Shape 类并实现了 Polygon 接口。

在 Main 类的 main 方法中,我们实例化了 Triangle 和 Rectangle 的对象,并调用了它们的 draw 和 getNumberOfSides 方法。由于 Shape 类是抽象类,因此我们无法直接实例化它本身。

        具体来说  “抽象类中可以有普通的方法这些方法可以有实现代码,不一定是抽象方法。”这种情况下,这些普通方法可以直接被子类继承和使用,子类可以选择不覆盖这些方法,也可以选择覆盖这些方法,实现多态的效果。

        举个例子,比如抽象类Animal表示一个动物,有一个普通方法eat(),表示动物的进食行为。如果我们的具体动物类如Dog、Cat、Bird等都可以使用这个方法,我们在Animal类中就可以实现它,而不必让每个具体类都来实现这个功能。在这种情况下,eat()方法可以在Animal类中定义实现代码,这样所有继承Animal类的子类就可以直接继承这个方法,而无需再次编写它。如果某个具体类需要特殊的eat()行为,它可以选择覆盖这个方法。这种情况下,Animal类就成为了一个带有可扩展功能的类。

Animal类中的eat()方法是一个普通方法,不属于抽象方法。抽象方法是没有实现的方法,而普通方法是有实现代码的方法。在Animal类中,如果我们需要定义一个默认的eat()方法实现,可以直接在方法中添加实现代码,而不需要用abstract关键字来声明它是一个抽象方法。当然,如果我们希望让某些特定的子类必须去覆盖eat()方法,那么我们可以将eat()方法声明为抽象方法,以强制子类去实现它。

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

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

相关文章

第二十一章 光源

光源是每个场景必不可少的部分,光源除了能够照亮场景之外,还可以产生阴影效果。 Unity中分为四种光源类型: 1. 方向光:Directional Light 用于模拟太阳光,方向光任何地方都能照射到。 2. 点光源:Point L…

Java面试题总结 | Java面试题总结9- RabbitMQ模块(持续更新)

RabbitMQ 文章目录 RabbitMQ为什么使用Rabbitmq而不是其他的消息队列为什么使用消息队列解耦异步削峰 消息队列有什么优缺点MQ的高可用保障单机模式 普通集群模式(无高可用性)镜像集群模式(高可用性) MQ如何保证不重复消费、幂等性…

浏览器安全之XSS跨站脚本

基本概念 跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的。 攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javas…

Vue.js 框架能力的官方认证

这两天Vue官方推出了Vue.js 认证计划。 即框架能力官方认证,即 Vue.js 框架能力证书。该认证由 Vue School 与 Vue.js 团队合作提供支持。官网:Vue.js - Official Certification Program 官方介绍此次的试题集和代码挑战由 Vue.js 核心团队审核&#xff…

react之按钮鉴权

使用HOC来完成 HOC:高阶组件,是React中复用组件逻辑的一种高级技巧。HOC自身不是React API的一部分,他是一种基于React的组合特性而形成的设计模式。 作用:用于复用组件的业务逻辑 VUE mixinReact Hoc 用户数据渲染带操作按钮渲…

Shell快速入门笔记

文章目录 Shell 快速入门笔记1、Shell概述2、Shell初体验4、注释5、变量6、数据类型6.1 字符串6.2 数组 7、参数传递8、运算符9、常用命令9.1 echo命令9.2 printf命令9.3 test命令 10、流程控制10.1 条件判断10.2 循环 11、函数12、输入/输出重定向12.0 前置知识12.1 输出重定向…

IPsec中IKE与ISAKMP过程分析(主模式-消息3)

IPsec中IKE与ISAKMP过程分析(主模式-消息1)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息2)_搞搞搞高傲的博客-CSDN博客 阶段目标过程消息IKE第一阶段建立一个ISAKMP SA实现通信双发的身份鉴别和密钥交换&…

一文详细介绍查看和启用nginx日志(access.log和error.log),nginx错误日志的安全级别,自定义访问日志中的格式

文章目录 1. 文章引言2. Nginx访问日志(access.log)2.1 简述访问日志2.2 启用Nginx访问日志2.3 自定义访问日志中的格式 3. Nginx错误日志(error.log)3.1 简述错误日志3.2 启用错误日志3.3 Nginx错误日志的安全级别 4. 文末总结 1. 文章引言 我们在实际工作中,经常使…

数字设计小思 - D触发器与死缠烂打的亚稳态

前言 本系列整理数字系统设计的相关知识体系架构,为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中,D触发器是最常用的器件,也可以说是时序逻辑的核心,本文根据个人的思考历程结合相关书籍内容和网上文章,聊一聊D…

函数-函数递归及练习

目录 1、什么是递归? 2、递归的两个必要条件 3、递归的练习 3.1 接受一个整型值(无符号),按照顺序打印它的每一位 3.2 编写函数不允许创建临时变量,求字符串的长度 3.3 求第n个斐波那契数 3.4 字符串逆序&…

Go语言-数据结构与算法

go语言之专业数据结构与算法 20.4 稀疏 sparsearray 数组 20.4.1 先看一个实际的需求  编写的五子棋程序中,有存盘退出和续上盘的功能 稀疏数组的处理方法是 : 1) 记录数组一共有几行几列,有多少个不同的值 2) 思想:把具有不同值…

【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )

文章目录 一、获取大图和 Seed 随机种子二、通过 seed 种子生成类似图像 一、获取大图和 Seed 随机种子 注意 : 一定是使用 U 按钮 , 在生成的大图的基础上 , 添加 信封 表情 , 才能获取该大图的 Seed 种子编码 ; 在上一篇博客生成图像的基础上 , 点击 U3 获取第三张图的大图 ;…

STL常用梳理——VECTOR常用接口及其迭代器实现

Vector篇 Vector介绍Vector实现1、定义默认构造函数使用实现 2、迭代器Iterator迭代器使用 3、空间增长问题使用实现 迭代器迭代器介绍迭代器实现 Vector介绍 vector是STL中容器之一,特性如下: vector是表示可变大小数组的序列容器。就像数组一样&#…

Python基础合集 练习21 (错误与异常处理语句)

‘’‘try: block1 except[ExceptionName]: block2 ‘’’ block1:执行代码,表示可能会出现错误的代码块 ExceptionName: 表示要捕获的异常名称,为可选参数.如果不指定异常名称,则表示捕获所有异常 block2:表示发生异常时执行的代码块 while True: try: num int(input(请输…

设计模式——工厂模式

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、工厂模式介绍 2、披萨项目需求 3、传统方式 4、非静态简单工厂模式 5、静态简单工厂模式 6、工厂方法模式 7、抽象工厂模…

spass modeler

课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…

目标检测模型量化---用POT工具实现YOLOv5模型INT8量化

POT工具是什么 POT工具,全称:Post-training Optimization Tool,即训练后优化工具,主要功能是将YOLOv5 OpenVINO™ FP32 模型进行 INT8 量化,实现模型文件压缩,从而进一步提高模型推理性能。 不同于 Quantiz…

MYSQL-数据库管理(上)

一、数据库概述 一、数据库基本概念 1.1 数据 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。…

Mask2Former来了!用于通用图像分割的 Masked-attention Mask Transformer

原理https://blog.csdn.net/bikahuli/article/details/121991697 源码解析 论文地址:http://arxiv.org/abs/2112.01527 项目地址:https://bowenc0221.github.io/mask2former Mask2Former的整体架构由三个组件组成: 主干特征提取器&#xff…

【Java笔试强训 29】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥求正数数…