【JAVA OOP】Day09 抽象方法、抽象类、接口、引用类型数组

news2024/11/14 15:45:34

Day09目标:

  • 理解抽象方法、抽象类的应用场景;

  • 掌握抽象方法、抽象类的语法;

  • 理解接口的应用场景;

  • 掌握接口的语法、应用;

  • 掌握引用类型数组的用法;

  • 代码量:课上120行,课下240行。


抽象类和接口

抽象类

设计规则

  • 适合初学者:共3点

    • 将子类共有的属性和行为,抽到父类 —— 抽取共性的

    • 若子类的行为或代码和父类都一样,设计普通方法;若子类的行为或父类代码和父类不一样,设计为抽象方法

    • ???

抽象方法、抽象类

Animal类:

public class Animal {
  String name;
  int age;
  String color;
  Animal(){
  }
  Animal(String name, int age, String color){...}
}

喝水方法(行为都一样 —— 普通方法

void drink() {
  System.out.println(color + "色的" + age + "岁的" + name + "正在喝水");
}

吃饭方法(行为不一样 —— 抽象方法

void eat() {
    System.out.println(color + "色的" + age + "岁的" + name + "正在吃饭");
}
  • 由abstract修饰,只有方法的定义,没有具体的实现(连{}都没有)

    • 包含抽象方法的类必须是抽象类,抽象类由abstract修饰

Animal类

public abstract class Animal { // 不完整
  String name;
  int age;
  String color;
  Animal(){
  }
  Animal(String name, int age, String color){...}
}

void drink(){
  System.out.println(color + "色的" + age + "岁的" + name + "正在喝水");
}
abstract void eat();  // 不完整,因为没有方法体
  • 抽象类不能被实例化(new对象)—— 单独存在没有意义
    Animal animal = new Animal();  // 编译错误
  • 抽象类是需要被继承的
  abstract class Animal{
    name, age, color
    void drink(){}
    abstract void eat();
  }
  class Dog extends Animal{ // 编译错误
  }
  class Chick extends Animal{
  }
  • 抽象类是需要被继承的,子类:

    • 也声明为抽象类

    • 重写所有方法 —— 变不完整为完整

  abstract class Animal{
    name, age, color
    void drink(){...}
    abstract void eat();
  }
  class Dog extends Animal{
    void eat(){
      System.out.println(color + "色的" + age + "岁的狗狗" + name + "正在吃骨头!")
    }
  }
  class Chick extends Animal{
    System.out.println(color + "色的" + age + "岁的小鸡" + name + "正在吃小米!");
  }

设计抽象方法的原因

  • 真实的项目都是团队协作完成的

    • 假设不设计抽象方法:

      • 张光设计Dog类,吃的方法名称为eat()

      • 李林设计Chick类,吃的方法名称为eating()

      • 赵亮设计Fish类,吃的方法名称为ate()

      • 孙其想让动物们吃饭 —— 需要记3个名字,还得与动物对应 → 麻烦

    • 假设设计抽象方法eat表示吃:

      • 张光设计Dog类,吃的方法只能叫eat(),必须重写

      • 李林设计Chick类,吃的方法只能叫eat(),必须重写

      • 赵亮设计Fish类,吃的方法只能叫eat(),必须重写

      • 孙其想让动物们吃饭 —— 需要记1个名字,不用区分动物 → 方便

抽象类的意义

  • 封装共有的属性和行为 —— 实现代码复用

  • 可以包含抽象方法:

    • 为子类提供统一的入口(名字统一)

    • 强制必须重写

接口

设计规则

  • 适合初学者:共3点(新老交替)

    • 所有子类共有的属性和行为,抽到父类中 —— 抽共性

    • 若子类的行为/代码都不一样,设计普通方法;若子类的行为/代码不一样,设计抽象方法

    • 部分子类有共有的行为,抽到接口

接口的应用

  • 在现有案例基础之上,添加如下需求:

    • 游泳

    • 游泳

    • 不会游泳

    在这里插入图片描述

  • 我们之前将父类理解成“亲爹”,而现在可以把接口理解成“干爹”。接口一般表示为:“具备某种功能”。

  • 接口的应用:

    • 接口是对继承单根性(单一继承)的扩展 —— 实现多继承

    • 接口是一种标准、规范,表述具备某种功能。实现了某接口就具备某个功能,不实现接口就不具备那个功能。

接口的语法

  • 接口是一种引用数据类型

  • 由interface定义

  • 目前内容而言,只能包含抽象方法(之后讲常量、默认方法、静态方法、私有方法

interface Inter {
  abstract void show();
  void test(); // 接口中的方法默认都是抽象的,前面已经默认有abstract了
  // void say(){}     // 抽象方法不能有方法体
}
  • 接口不能被实例化(new对象)
Inter o = new Inter();  // 编译错误,接口不能被实例化
  • 接口是需要被实现的,实现类必须重写接口中的所有抽象方法。注意:重写接口中的方法时必须加public
interface Inter{
  abstract void show();
  void test();
}
class InterImpl implements Inter{
  public void show(){
  }
  public void test(){
  }
}

接口的特点

  • 一个类可以实现多个接口,以逗号分隔

  • 若又继承又实现时,必须先继承后实现

interface Inter1{
  void show();
}
interface Inter2{
  void test();
}
abstract class Aoo{
  say();
}
class Boo extends Aoo implements Inter1, Inter2{
  @Override
  public void show();
  @Override
  public void test();
  @Override
  void say();  // 前面public可写可不写
}
  • 接口可以继承接口
interface Inter3{
  void show();
}
interface Inter4 extends Inter3{
  void test();
}
class Coo implements Inter4{
  public void test(){}
  public void show(){}
}

(类与类 —— 继承)

(接口与接口 —— 继承)

(类与接口 —— 实现)

引用类型数组

什么是引用类型数组?

  • 引用类型数组:数组元素为引用类型的数组

    • 存储10名学生:Student[] student = new Student[10];

    • 存储3只小狗:Dog[] dogs = new Dog[3]; 声明Dog型数组,包含3个元素;每个元素都是Dog类型,默认值为null

    • 存储5辆汽车:Car[] cars = new Car[5];

引用类型数组特点

  • 引用类型数组与基本类型数组,有两点区别

    • 给引用类型数组的元素赋值时,需要new个对象
    int[] arr = new int[3];  // 基本类型数组
    arr[0] = 100;
    
    Dog[] dogs = new Dog[3]; // 引用类型数组 ——— 创建Dog数组对象
    dogs[0] = new Dog("小黑", 2, "黑"); // 创建Dog对象
    
    • 访问引用类型数组元素的属性/行为时,需要打点访问
    Dog[] dogs = new Dog[3];
    dogs[0] = new Dog("小黑", 2, "黑");
    dogs[1] = new Dog("小白", 1, "白");
    dogs[2] = new Dog("小灰", 3, "灰");
    // 输出第一只狗狗的名字
    System.out.println(dog[0].name);
    // 第3只狗狗游泳
    dogs[2].swim();
    
    属性:name、age、color
    行为:eat()drink()lookHome()swim()
    

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

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

相关文章

AvaloniaChat—从源码构建指南

AvaloniaChat介绍 一个使用大型语言模型进行翻译的简单应用。 我自己的主要使用场景 在看英文文献的过程中,比较喜欢对照着翻译看,因此希望一边是英文一边是中文,虽然某些软件已经自带了翻译功能,但还是喜欢大语言模型的翻译&…

2-69 基于matlab的三坐标雷达目标跟踪数据融合

基于matlab的三坐标雷达目标跟踪数据融合,采用的是概率数据关联算法和EKF,展示了目标的真实轨迹和跟踪滤波轨迹,以及数据融合的轨迹。程序已调通,可直接运行。 2-69 三坐标雷达目标跟踪数据融合 - 小红书 (xiaohongshu.com)

『 Linux 』利用UDP套接字简单进行网络通信

文章目录 Socket常见API转网络字节序网络数据传输的读网络数据传输的写 简单的UDP网络程序服务端基本结构Init() 服务端的初始化Run() 服务端的运行服务端启动及测试 简单的UDP网络程序客户端服务端客户端相互通信测试服务端通过传入命令处理实现远程命令执行参考代码 Socket常…

STM32————串口发送和接收数据包

首先进行实验,对于代码在上一节的基础上,先定义新变量以及增加一个发送数据包函数: 本代码设置FF为包头,FE为包尾,中间为需要传输的数据,一次为4个,之后是接收数据包的函数 当标志位为1代表接收…

SpringBoot+Vue实现大文件上传(分片上传)

SpringBootVue实现大文件上传(分片上传) 1 环境 SpringBoot 3.2.1,Vue 2,ElementUI 2 问题 前几篇文章,可以用于较小文件的上传,对于较大文件来说,为了提高上传效率和可靠性,可以采…

LeetCode题练习与总结:二叉树的右视图--199

一、题目描述 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出…

判别回形针的方向(clip.hdev)

1.1应用示例思路 (1) 利用Blob分析(一般步骤:图像阈值分割、获取连通区域、计算Blob的相关几何特征),获取目标区域。 (2) 求目标区域的中心坐标和方向。 1.2应用实例代码 * clip.hdev: Orientation of clips*是否必须在活动的图形窗口中显示图标对象…

“论面向服务架构设计及其应用”写作框架,软考高级,系统架构设计师

论文真题 面向服务架构(Service-Oriented Architecture, SOA) 是一种应用框架,将日常的业务应用划分为单独的业务功能服务和流程,通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构,用…

GPT-5 惊涛来袭:铸就智能新传奇

目录 引言: 正文: 方向一:人工智能发展现状 方向二:GPT-5技术突破预测 方向三:智能系统人类协作 方向四:迎接AI技术变革策略 结束语: 引言: 在科技浩渺浪潮澎湃翻涌的时代&…

ThinkPHP5 5.0.23 远程代码执行漏洞

目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…

聚星文社,绘唐科技AI工具

聚星文社是一个文学创作社区,为广大创作者提供了一个交流和展示作品的平台。绘唐科技是一家AI技术公司,专注于开发人工智能工具和解决方案。绘唐科技与聚星文社合作,为聚星文社的创作者提供了一款AI工具,帮助创作者提升创作效率和…

ES+FileBeat+Kibana日志采集搭建体验

1.环境准备 需要linux操作系统,并安装了docker环境 此处使用虚拟机演示。(虚拟机和docker看参考我之前写的文章) VirtualBox安装Oracle Linux 7.9全流程-CSDN博客 VirtualBox上的Oracle Linux虚拟机安装Docker全流程-CSDN博客 简单演示搭建ES…

高可用集群keepalived 详细讲解

一:高可用集群keepalived LB:Load Balance 负载均衡 负载均衡,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器…

git详细命令

git常用命令,待 1. 前言2. Git安装3. 公钥3.1 生成公钥3.2 配置SSH 密钥 4. 配置用户名和邮箱5. git常用命令5.1 创建仓库命令5.1.1 git init命令5.1.2 git clone[url] 命令 5.2 add 增加 / 删除文件 (跟踪文件)5.3 代码提交5.4 分支5.5 标签…

性能优化理论篇 | Cache VS Buffer,傻傻分不清 ?

性能优化系列目录: 性能优化理论篇 | 彻底弄懂系统平均负载 性能优化理论篇 | swap area是个什么东西 从free命令开始 free 命令是一个在类 Unix 操作系统中用于显示内存使用情况的工具。它的输出包含了系统内存的不同方面,如总内存、已用内存、空闲内存…

不同路径 II[中等]

优质博文:IT-BLOG-CN 一、题目 一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为Start)。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为Finish)。 现在考虑网格中有…

@[TOC](letcode 分类练习 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度)

letcode 分类练习 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 226.翻转二叉树101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度 226.翻转二叉树 利用自底向上的遍历交换左子树和右子树 class Solution { public:TreeNode* invertTr…

后端Web之数据库(以MySQL为例)

目录 1.概述 2.MySQL 3.DDL 4.DML 5.DQL 1.概述 对于我们自己写的一些小功能,数据一般存储在文件中,比如XML文件。而在实际项目中,数据都是存放在数据库中的。数据库(DataBase )是一个存储数据的集合&#xff0c…

双剑合璧,网络无敌!Windows Server 2012 R2双网卡绑定实战教程

文章目录 双剑合璧,网络无敌!Windows Server 2012 R2双网卡绑定实战教程1 背景信息2 配置步骤2.1 登录服务器2.2 分别清除两块网卡的配置2.3 进入“本地服务器”界面2.4 进入“NIC组合”界面2.5 创建网卡绑定组2.6 设置新建组参数2.7 查看已创建的网卡组…

【计算机硬件蓝光光驱】

蓝光光驱(Blu-ray Disc Drive)是一种光盘驱动器,用于读取和写入蓝光光盘。蓝光光盘是一种高容量、高清晰度的光存储介质,用于存储视频、音频、数据等多种媒体内容。蓝光光驱的名称“蓝光”来源于其使用的蓝色激光光束,…