4.3 抽象类和接口

news2024/11/25 19:37:35

 思维导图:

 

4.3 抽象类和接口的笔记


4.3.1 抽象类
  • 定义:当一个类需要定义成员方法描述其行为特征,但这些方法的实现方式无法确定时,Java提供了抽象类来满足这种需求。

  • 特点

    • 抽象方法是使用abstract关键字修饰的方法,无需实现方法体。
    • 抽象类可以包含属性、普通方法和抽象方法。
    • 抽象类中可以没有抽象方法,但包含抽象方法的类必须声明为抽象类。
  • 语法

    abstract class 抽象类名称 {
        访问权限 返回值类型 方法名称(参数);
        访问权限 abstract 返回值类型 抽象方法名称(参数);
    }
    

  • 规则

    1. 包含抽象方法的类必须是抽象类。
    2. 抽象类和抽象方法都使用abstract关键字修饰。
    3. 抽象方法只声明不实现。
    4. 非抽象子类必须重写抽象类中的所有抽象方法。
  • 注意

    • 抽象方法不能被声明为private,因为它们必须在子类中被实现。
  • 案例:文件4-10示例了一个Animal抽象类和其子类DogAnimal类中有一个抽象方法shout(),而Dog类继承Animal类并实现了shout()方法。当创建Dog对象并调用shout()方法时,输出结果为“汪汪……”。


[4.3.2 接口] (根据您提供的信息,以下部分是基于可能的内容推断的。)
  • 定义:接口是一种特殊的抽象类型,用于声明对象应该具备哪些方法。在Java中,接口主要用于声明方法规范。

  • 特点

    • 接口中所有的方法默认都是公开且抽象的。
    • 接口可以有默认方法和静态方法。
  • 语法

    public interface 接口名称 {
        返回值类型 方法名称(参数);
    }
    

  • 注意

    • 接口中的方法默认访问权限是public,不允许使用其他访问修饰符。
    • 接口不能直接实例化。

结论:抽象类和接口都提供了一种方式来定义对象应该如何表现,但它们的使用和目的略有不同。抽象类更多地关注于提供一个基础和部分实现,而接口更多地关注于提供规范和契

 

4.3.2 接口

接口是用于描述类或结构的一组相关行为的定义,没有实现。接口产生了“面向接口编程”的概念,即将程序的不同业务逻辑分离,并使用接口来连接不同的业务模块。接口中不实现任何业务逻辑,这些逻辑由实现接口的类来完成。当业务需求变更时,只需要更改实现类的逻辑而无需更改接口,从而降低了系统的维护成本。

类比实例:鼠标、U盘等外部设备通过USB接口连接到计算机上,非常方便。如果我们想更换外部设备,只需要更换USB设备即可,而不需要更改USB接口。这种思想就是面向接口编程。

在Java中,接口主要用于克服单一继承的局限性,因为一个类只能继承一个父类,但可以实现多个接口。在JDK 8之前,接口主要由全局常量和抽象方法组成。从JDK 8开始,接口可以定义默认方法和静态方法。

接口的定义

[public] interface 接口名 [extends 接口1, 接口2, ...] {
    [public][static][final] 数据类型 常量名 = 值;
    [public][abstract] 返回值的数据类型 方法名(参数列表);
    [public] static 返回值的数据类型 方法名(参数列表);
    [public] default 返回值的数据类型 方法名(参数列表);
}
  • 一个接口可以继承多个父接口。
  • 接口中的变量默认为 public static final(全局常量)。
  • 接口中的抽象方法默认为 public abstract
  • 接口不能直接实例化。
  • 实现接口的类必须实现接口中的所有抽象方法。
  • 一个类可以实现多个接口。

接口的实现

修饰符 class 类名 implements 接口1, 接口2, ... {
    // 实现接口中的方法...
}

示例

interface Animal {
    int ID = 1;
    String NAME = "牧羊犬";
    void shout();
    public void info();
    static int getID() {
        return ID;
    }
}

interface Action {
    public void eat();
}

class Dog implements Animal, Action {
    public void eat() {
        System.out.println("喜欢吃骨头");
    }
    public void shout() {
        System.out.println("汪汪……");
    }
    public void info() {
        System.out.println("名称:" + NAME);
    }
}

public class Example11 {
    public static void main(String[] args) {
        System.out.println("编号: " + Animal.getID());
        Dog dog = new Dog();
        dog.info();
        dog.shout();
        dog.eat();
    }
}

如果一个类既要实现接口又要继承抽象类,可以使用以下语法:

修饰符 class 类名 extends 父类名 implements 接口1, 接口2, ... {
    // 方法实现...
}

总结

接口提供了一种方式来描述一个类应该做什么,而不是怎么做。这为代码的复用和模块化提供了方便。

 

Java接口和抽象类概述

1. Animal接口

  • 位置:文件4-12中,第2~6行
  • 内容:声明了全局常量NAME和抽象方法shout()info()

2. Action抽象类

  • 位置:文件4-12中,第8~10行
  • 内容:定义了抽象方法eat()

3. Dog类(继承和实现)

  • 位置:文件4-12中,第12~25行
  • 内容
    • 继承了Action抽象类
    • 实现了Animal接口
    • 重写了shout()info()eat()方法。

4. 运行结果

  • 文件:文件4-12
  • 输出
    • 名称:牧羊犬
    • 汪汪…
    • 喜欢吃骨头

5. Color接口

  • 位置:文件4-13中,第6~9行
  • 内容:定义了抽象方法black()

6. Action接口(接口的继承)

  • 位置:文件4-13中,第11~13行
  • 内容
    • 继承了AnimalColor接口
    • 定义了shout()方法。

7. Dog类(接口实现)

  • 位置:文件4-13中,第15~28行
  • 内容
    • 实现了Action接口
    • 重写了info()black()shout()方法。

8. 运行结果

  • 文件:文件4-13
  • 输出
    • 名称:牧羊犬
    • 汪汪…
    • 黑色

综合点评

  • Dog类在文件4-12中实现了Animal接口和继承了Action抽象类,成功重写了相关方法并在测试类中进行了调用。
  • 在文件4-13中,接口的继承被展示,其中Action接口继承了AnimalColor接口。
  • Dog类再次通过实现Action接口,展示了如何重写多个继承自不同接口的方法。
  • 运行结果分别证明了Dog类成功地重写了不同来源的方法,并且可以通过实例化对象访问

 

 

 

总结: 

抽象类

重点:

  1. 抽象类不能实例化,主要作为基类用于继承。
  2. 抽象类可以包含抽象方法(没有实体的方法)和具体方法。
  3. 子类继承抽象类必须实现其所有的抽象方法,除非子类也是抽象类。

难点:

  1. 理解抽象类与普通类的根本区别及其应用场景。
  2. 抽象类与普通类、接口之间的选择问题。

易错点:

  1. 尝试实例化一个抽象类。
  2. 忘记在继承抽象类的非抽象子类中实现所有抽象方法。
  3. 将不应该被实例化的类设计为普通类,而不是抽象类。

接口

重点:

  1. 接口是完全抽象的,不能包含具体的方法实现。
  2. 类可以实现多个接口,解决了Java单继承的局限。
  3. 接口中的变量默认为public static final,方法默认为public abstract

难点:

  1. 理解接口与抽象类的区别和各自的应用场景。
  2. 理解如何在实现多个接口时处理可能出现的名称冲突或相同方法签名。

易错点:

  1. 在接口中定义具体的方法实现(Java 8后,接口可以有默认方法和静态方法,但这是特例)。
  2. 将接口中的变量当作非final来使用,试图修改它们。
  3. 实现多个接口时,忘记实现其中某个接口的某个方法。

抽象类与接口的对比

难点:

  1. 何时使用抽象类,何时使用接口。
  2. 如何在类的设计和继承/实现关系中平衡抽象类和接口的使用。

易错点:

  1. 在需要多重继承功能的场景中选择抽象类而不是接口。
  2. 在设计时过于依赖抽象类,导致系统缺乏灵活性。
  3. 混淆抽象类和接口的语法,如尝试使接口继承类或使抽象类实现接口但不提供方法的实现。

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

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

相关文章

Spring-创建非懒加载的单例Bean源码

补充&#xff1a;关于扫描的逻辑 /*** Scan the class path for candidate components.* param basePackage the package to check for annotated classes* return a corresponding Set of autodetected bean definitions*/ public Set<BeanDefinition> findCandidateCo…

【C++】无重复数字全排列(三种方法)和有重复数字全排列

文章目录 一、无重复数字排列1.1 题目描述1.2 用dfs方法1.2.1 思路分析1.2.2 代码编写 1.3 用交换法1.4 STL秒解1.4.1 所用函数1.4.2 代码编写 二、有重复数字排列2.1 思路分析2.2 代码编写 一、无重复数字排列 1.1 题目描述 把 1 ∼ n 1∼n 1∼n 这 n n n 个整数排成一行后…

Xray+awvs联动扫描

首先xray开启监听 xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-xxx.html --plugins sqldet,xxe,upload,brute-force,cmd-injection,struts,thinkphp 然后准备目标csv文件,每行一个url或ip然后加个逗号 接着awvs导入csv 对导进来的每个目…

【python海洋专题三十四】调用自己的colormore

点击蓝字&#xff0c;关注我们 ​ 【python海洋专题三十四】调用自己的colormore 有时候不想使用他们给好的&#xff0c;调用自己的colormore 使用素材 ncl的colormore。 格式文本格式&#xff01; 这样自己的colormore存入txt也可以使用了。 ​ 结果呈现 单个颜色调…

网络层协议【IP协议】

全文目录 基本概念IP协议IPv4 协议头格式&#xff1a;分片发送方进行分片&#xff1a;识别IP分片&#xff1a;组装IP分片&#xff1a; 网段划分DHCP技术IP分类 私有IP和共有IP1. 私有IP地址&#xff08;Private IP Address&#xff09;&#xff1a;2. 公网IP地址&#xff08;Pu…

接入文心一言实战(一):API申请与测试

大家好&#xff0c;我是豆小匠。 这期来介绍申请百度文心一言API的步骤。 第一步 注册百度智能云账号 网址&#xff1a;https://login.bce.baidu.com/new-reg?tplbceplat&fromportal 第二步&#xff1a;申请预置模型 网址&#xff1a;https://console.bce.baidu.com/qi…

VCS与XRUN对语法支持的不同点(持续更新...)

静态方法声明位置不同&#xff1a;VCS支持声明在class内/外&#xff08;extern&#xff09;两种方式&#xff0c;XRUN只支持static function声明于类内&#xff0c;不支持类外声明&#xff08;带extern关键字&#xff09;。 字符串转二进制、8进制、十进制、16进制方法&#xf…

【算法挑战】字符串解码(含解析、源码)

394.字符串解码 https://leetcode-cn.com/problems/decode-string/ 394.字符串解码 题目描述方法 1: 递归 思路复杂度分析代码 方法 2: 循环 栈 图解复杂度分析代码 题目描述 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。编码规则为: k[encoded_string]…

VSCode 设置平滑光标

1.点击左下角的设置按钮&#xff0c;再点击设置 2.点击文本编辑器&#xff0c;点击光标&#xff0c;勾选控制是否启用平滑插入动画。 3.随便打开一个文件&#xff0c;上下左右移动光标时&#xff0c;会发现非常的流畅。 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023…

【AUTOSAR】【以太网】EthSyn

AUTOSAR专栏——总目录_嵌入式知行合一的博客-CSDN博客文章浏览阅读215次。本文主要汇总该专栏文章,以方便各位读者阅读。https://xianfan.blog.csdn.net/article/details/132072415 目录 一、概述 二、功能描述 2.1 初始化

深入了解进口跨境商城源码的电商开发的关键

随着全球电子商务的快速发展&#xff0c;进口跨境商城源码的电商开发逐渐成为一种趋势。本文将深入探讨进口跨境商城源码的电商开发的关键&#xff0c;包括需求分析、技术实现、运营推广、风险控制等方面。 一、需求分析 在进口跨境商城源码的电商开发中&#xff0c;需求分析是…

【C/C++】 常量指针、指针常量、指向常量的常指针

const修饰指针的三种情况 int main() {int a 10;int b 10;//常量指针//const修饰的是int&#xff0c;指针指向可以改&#xff0c;指针指向的值不可以更改const int * p1 &a; p1 &b; //正确//*p1 100; 报错//指针常量//const修饰的是指针&#xff0c;指针的值&am…

Appium 移动端自动化测试 —— 触摸(TouchAction) 与多点触控(MultiAction)

一、触摸 TouchAction 在所有的 Appium 客户端库里&#xff0c;TouchAction 触摸对象被创建并被赋予一连串的事件。 规范里可用的事件有&#xff1a; * 短按(press) * 释放(release) * 移动到(moveTo) * 点击(tap) * 等待(wait) * 长按(longPress) * 取消(cancel) * 执行(per…

Unity屏幕中涂鸦

LineRenderer LineRenderer是Unity中的一个组件&#xff0c;用于在场景中绘制简单的线段。 LineRenderer组件允许你通过设置一系列顶点来定义线段的形状和外观。它会根据这些顶点自动在场景中绘制出线段。 下面是LineRenderer的一些重要属性和方法&#xff1a; positionCou…

串口通信(6)应用定时器中断+串口中断实现接收一串数据

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

LICEcap使用教程

打开LICEcap&#xff0c;显示如下 点击Record&#xff0c;开始录制 点击Stop&#xff0c;停止录制 点击Record&#xff0c;进入该页面 display in animation&#xff08;在动画中显示&#xff09; title frame&#xff08;标题框&#xff09; - - - sec&#xff08;秒&…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

Vue路由导航(replace、push、forward、back、go)

Vue路由导航&#xff08;replace、push、forward、back、go&#xff09; 先了解栈结构&#xff0c;再学习以下内容 栈的数据结构&#xff1a;先进后出&#xff0c;后进先出。原理&#xff1a;push将元素压入栈内&#xff0c;pop将元素弹出&#xff0c;栈有分别有栈底指针和栈顶…

Linux系统编程,socket通信编程实践练习(C语言)

文章目录 Linux系统编程&#xff0c;socket通信编程实践练习&#xff08;C语言&#xff09;1.服务端代码2.客户端代码 Linux系统编程&#xff0c;socket通信编程实践练习&#xff08;C语言&#xff09; 1.服务端代码 #include <stdio.h> #include <stdlib.h> #in…

Linux纯C串口开发

为什么要用纯C语言 为了数据流动加速&#xff0c;实现低配CPU建立高速数据流而不用CPU干预&#xff0c;避免串口数据流多次反复上升到软件应用层又下降低到硬件协议层。 关于termios.h 麻烦的是&#xff0c;在 Linux 中使用串口并不是一件最简单的事情。在处理 termios.h 标头…