当前位置: 首页 > news >正文

java接口和多态

1.接口

1.1黑马信息管理系统集合改进 (应用)

  • 使用数组容器的弊端

    1. 容器长度是固定的,不能根据添加功能自动增长

    2. 没有提供用于赠删改查的方法

  • 优化步骤

    1. 创建新的StudentDao类,OtherStudentDao

    2. 创建ArrayList集合容器对象

    3. OtherStudentDao中的方法声明,需要跟StudentDao保持一致

      注意:如果不一致,StudentService中的代码就需要进行修改

    4. 完善方法(添加、删除、修改、查看)

    5. 替换StudentService中的Dao对象

  • 代码实现

    OtherStudentDao类

    public class OtherStudentDao {// 集合容器private static ArrayList<Student> stus = new ArrayList<>();
    ​static {Student stu1 = new Student("heima001","张三","23","1999-11-11");Student stu2 = new Student("heima002","李四","24","2000-11-11");
    ​stus.add(stu1);stus.add(stu2);}
    ​// 添加学生方法public boolean addStudent(Student stu) {stus.add(stu);return true;}
    ​// 查看学生方法public Student[] findAllStudent() {
    ​Student[] students = new Student[stus.size()];
    ​for (int i = 0; i < students.length; i++) {students[i] = stus.get(i);}
    ​return students;}
    ​public void deleteStudentById(String delId) {// 1. 查找id在容器中所在的索引位置int index = getIndex(delId);stus.remove(index);}
    ​public int getIndex(String id){int index = -1;for (int i = 0; i < stus.size(); i++) {Student stu = stus.get(i);if(stu != null && stu.getId().equals(id)){index = i;break;}}return index;}
    ​public void updateStudent(String updateId, Student newStu) {// 1. 查找updateId, 在容器中的索引位置int index = getIndex(updateId);stus.set(index, newStu);}
    }

    StudentService类

    public class StudentService {// 创建StudentDao (库管)private OtherStudentDao studentDao = new OtherStudentDao();// 其他方法没有变化,此处省略...
    }    

1.2黑马信息管理系统抽取Dao (应用)

  • 优化步骤

    1. 将方法向上抽取,抽取出一个父类 ( BaseStudentDao )

    2. 方法的功能实现在父类中无法给出具体明确,定义为抽象方法

    3. 让两个类分别继承 BaseStudentDao ,重写内部抽象方法

  • 代码实现

    BaseStudentDao类

    public abstract class BaseStudentDao {// 添加学生方法public abstract boolean addStudent(Student stu);// 查看学生方法public abstract Student[] findAllStudent();// 删除学生方法public abstract void deleteStudentById(String delId);// 根据id找索引方法public abstract int getIndex(String id);// 修改学生方法public abstract void updateStudent(String updateId, Student newStu);
    }

    StudentDao类

    public class StudentDao extends BaseStudentDao {// 其他内容不变,此处省略
    }

    OtherStudentDao类

    public class OtherStudentDao extends BaseStudentDao {// 其他内容不变,此处省略
    }

1.3接口的概述(理解)

  • 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。

  • Java中接口存在的两个意义

    1. 用来定义规范

    2. 用来做功能的拓展

1.4接口的特点(记忆)

  • 接口用关键字interface修饰

    public interface 接口名 {} 
  • 类实现接口用implements表示

    public class 类名 implements 接口名 {}
  • 接口不能实例化

    我们可以创建接口的实现类对象使用

  • 接口的子类

    要么重写接口中的所有抽象方法

    要么子类也是抽象类

1.5接口的成员特点(记忆)

  • 成员特点

    • 成员变量

      只能是常量 ​ 默认修饰符:public static final

    • 构造方法

      没有,因为接口主要是扩展功能的,而没有具体存在

    • 成员方法

      只能是抽象方法

      默认修饰符:public abstract

      关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解

  • 代码演示

    • 接口

    public interface Inter {public static final int NUM = 10;
    ​public abstract void show();
    }
    • 实现类

    class InterImpl implements Inter{
    ​public void method(){// NUM = 20;System.out.println(NUM);}
    ​public void show(){
    ​}
    }
    • 测试类

    public class TestInterface {/*成员变量: 只能是常量 系统会默认加入三个关键字public static final构造方法: 没有成员方法: 只能是抽象方法, 系统会默认加入两个关键字public abstract*/public static void main(String[] args) {System.out.println(Inter.NUM);}}

1.6类和接口的关系(记忆)

  • 类与类的关系

    继承关系,只能单继承,但是可以多层继承

  • 类与接口的关系

    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

  • 接口与接口的关系

    继承关系,可以单继承,也可以多继承

1.7黑马信息管理系统使用接口改进 (应用)

  • 实现步骤

    1. 将 BaseStudentDao 改进为一个接口

    2. 让 StudentDao 和 OtherStudentDao 去实现这个接口

  • 代码实现

    BaseStudentDao接口

    public interface BaseStudentDao {// 添加学生方法public abstract boolean addStudent(Student stu);// 查看学生方法public abstract Student[] findAllStudent();// 删除学生方法public abstract void deleteStudentById(String delId);// 根据id找索引方法public abstract int getIndex(String id);// 修改学生方法public abstract void updateStudent(String updateId, Student newStu);
    }

    StudentDao类

    public class StudentDao implements BaseStudentDao {// 其他内容不变,此处省略
    }

    OtherStudentDao类

    public class OtherStudentDao implements BaseStudentDao {// 其他内容不变,此处省略
    }

1.8黑马信息管理系统解耦合改进 (应用)

  • 实现步骤

    1. 创建factory包,创建 StudentDaoFactory(工厂类)

    2. 提供 static 修改的 getStudentDao 方法,该方法用于创建StudentDao对象并返回

  • 代码实现

    StudentDaoFactory类

    public class StudentDaoFactory {public static OtherStudentDao getStudentDao(){return new OtherStudentDao();}
    }

    StudentService类

    public class StudentService {// 创建StudentDao (库管)// private OtherStudentDao studentDao = new OtherStudentDao();
    ​// 通过学生库管工厂类, 获取库管对象private OtherStudentDao studentDao = StudentDaoFactory.getStudentDao();
    }  

2.接口组成更新

2.1接口组成更新概述【理解】

  • 常量

    public static final

  • 抽象方法

    public abstract

  • 默认方法(Java 8)

  • 静态方法(Java 8)

  • 私有方法(Java 9)

2.2接口中默认方法【应用】

  • 格式

    public default 返回值类型 方法名(参数列表) { }

  • 作用

    解决接口升级的问题

  • 范例

    public default void show3() { 
    }

    注意事项

    • 默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字

    • public可以省略,default不能省略

    • 如果实现了多个接口,多个接口中存在相同的方法声明,子类就必须对该方法进行重写

2.3接口中静态方法【应用】

  • 格式

    public static 返回值类型 方法名(参数列表) { }

    范例

    • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

    • public可以省略,static不能省略

  • public static void show() {
    }

    注意事项

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

  • public可以省略,static不能省略

2.4接口中私有方法【应用】

  • 私有方法产生原因

    Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性

  • 定义格式

    • 格式1

      private 返回值类型 方法名(参数列表) { }
    • 范例1

      private void show() {  
      }
    • 格式2

      private static 返回值类型 方法名(参数列表) { }
    • 范例2

      private static void method() {  
      }
  • 注意事项

    • 默认方法可以调用私有的静态方法和非静态方法

    • 静态方法只能调用私有的静态方法

3.多态

3.1多态的概述(记忆)

  • 什么是多态

    同一个对象,在不同时刻表现出来的不同形态

  • 多态的前提

    • 要有继承或实现关系

    • 要有方法的重写

    • 要有父类引用指向子类对象

  • 代码演示

    class Animal {public void eat(){System.out.println("动物吃饭");}
    }
    ​
    class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}
    }
    ​
    public class Test1Polymorphic {/*多态的前提:
    ​1. 要有(继承 \ 实现)关系2. 要有方法重写3. 要有父类引用, 指向子类对象*/public static void main(String[] args) {// 当前事物, 是一只猫Cat c = new Cat();// 当前事物, 是一只动物Animal a = new Cat();a.eat();
    ​}
    }

3.2多态中的成员访问特点(记忆)

  • 成员访问特点

    • 成员变量

      编译看父类,运行看父类

    • 成员方法

      编译看父类,运行看子类

  • 代码演示

    class Fu {int num = 10;
    ​public void method(){System.out.println("Fu.. method");}
    }
    ​
    class Zi extends Fu {int num = 20;
    ​public void method(){System.out.println("Zi.. method");}
    }
    ​
    public class Test2Polymorpic {/*多态的成员访问特点:
    ​成员变量: 编译看左边 (父类), 运行看左边 (父类)
    ​成员方法: 编译看左边 (父类), 运行看右边 (子类)*/public static void main(String[] args) {Fu f = new Zi();System.out.println(f.num);f.method();}
    }

3.3多态的好处和弊端(记忆)

  • 好处

    提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作

  • 弊端

    不能使用子类的特有成员

3.4多态中的转型(应用)

  • 向上转型

    父类引用指向子类对象就是向上转型

  • 向下转型

    格式:子类型 对象名 = (子类型)父类引用;

  • 代码演示

    class Fu {public void show(){System.out.println("Fu..show...");}
    }
    ​
    class Zi extends Fu {@Overridepublic void show() {System.out.println("Zi..show...");}
    ​public void method(){System.out.println("我是子类特有的方法, method");}
    }
    ​
    public class Test3Polymorpic {public static void main(String[] args) {// 1. 向上转型 : 父类引用指向子类对象Fu f = new Zi();f.show();// 多态的弊端: 不能调用子类特有的成员// f.method();
    ​// A: 直接创建子类对象// B: 向下转型
    ​// 2. 向下转型 : 从父类类型, 转换回子类类型Zi z = (Zi) f;z.method();}
    }

3.5多态中转型存在的风险和解决方案 (应用)

  • 风险

    如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException

  • 解决方案

    • 关键字

      instanceof

    • 使用格式

      变量名 instanceof 类型

      通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果

  • 代码演示

    abstract class Animal {public abstract void eat();
    }
    ​
    class Dog extends Animal {public void eat() {System.out.println("狗吃肉");}
    ​public void watchHome(){System.out.println("看家");}
    }
    ​
    class Cat extends Animal {public void eat() {System.out.println("猫吃鱼");}
    }
    ​
    public class Test4Polymorpic {public static void main(String[] args) {useAnimal(new Dog());useAnimal(new Cat());}
    ​public static void useAnimal(Animal a){  // Animal a = new Dog();// Animal a = new Cat();a.eat();//a.watchHome();
    ​
    //        Dog dog = (Dog) a;
    //        dog.watchHome();  // ClassCastException  类型转换异常// 判断a变量记录的类型, 是否是Dogif(a instanceof Dog){Dog dog = (Dog) a;dog.watchHome();}}
    ​
    }

3.6黑马信息管理系统多态改进 (应用)

  • 实现步骤

    1. StudentDaoFactory类中方法的返回值定义成父类类型BaseStudentDao

    2. StudentService中接收方法返回值的类型定义成父类类型BaseStudentDao

  • 代码实现

    StudentDaoFactory类

    public class StudentDaoFactory {public static BaseStudentDao getStudentDao(){return new OtherStudentDao();}
    }

    StudentService类

    public class StudentService {// 创建StudentDao (库管)// private OtherStudentDao studentDao = new OtherStudentDao();
    ​// 通过学生库管工厂类, 获取库管对象private BaseStudentDao studentDao = StudentDaoFactory.getStudentDao();
    }  

相关文章:

java接口和多态

1.接口 1.1黑马信息管理系统集合改进 (应用) 使用数组容器的弊端 容器长度是固定的&#xff0c;不能根据添加功能自动增长 没有提供用于赠删改查的方法 优化步骤 创建新的StudentDao类&#xff0c;OtherStudentDao 创建ArrayList集合容器对象 OtherStudentDao中的方法声明…...

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…...

【Maven】008-Maven 私服搭建与使用

【Maven】008-Maven 私服搭建与使用 文章目录 【Maven】008-Maven 私服搭建与使用一、概述1、简介2、建立私服后依赖查找和下载逻辑第一步&#xff1a;请求本地仓库第二步&#xff1a;请求 Maven 私服第三步&#xff1a;请求外部远程仓库&#xff08;远程中央仓库等&#xff09…...

TMDB电影数据分析(下)

TMDB电影数据分析&#xff08;下&#xff09; 本文对源自Kaggle TMDB电影数据集进行分析影响电影票房的因素&#xff0c;数据分析流程包含数据集概分析、数据清洗、数据统计以及分析影响电影票房的因素。影响票房因素可能是电影预算、电影类型、电影时长、受欢迎程度、电影评分…...

django后台手机号加密存储

需求&#xff1a; 1 &#xff1a;员工在填写用户的手机号时&#xff0c;直接填写&#xff0c;在django后台中输入 2&#xff1a;当员工在后台确认要存储到数据库时&#xff0c;后台将会把手机号进行加密存储&#xff0c;当数据库被黑之后&#xff0c;手机号字段为加密字符 3&am…...

三、Qt Creator 使用

关于Qt的安装及环境配置&#xff0c;在我的上一篇《二、QT下载、安装及问题解决(windows系统)》已经讲过了。 本章节有一个重点&#xff0c;在新建 工程文件时&#xff0c;所在路径不要有中文&#xff0c;否则编译及运行程序不能正常运行。 在使用Qt Creator&#xff08;以下…...

css 边框渐变

需求&#xff1a; 普通的div 边框不好看&#xff0c;做一个渐变色 进程&#xff1a; 最简单的当然是做一个内部是白色的边框是渐变色的图&#xff0c;然后使用 background: url("back.jpg")&#xff0c;这样看起来就像是做了一个渐变的边框如果做不了图&#xff0…...

SofaMQ一些常用的API

SofaMQ的十五种常用的API 引言 SofaMQ作为阿里巴巴开源的消息中间件&#xff0c;提供了丰富的API以支持各种消息传递场景。在本文中&#xff0c;我们将介绍SofaMQ的十五种常用API&#xff0c;并通过实例演示其用法。 1. Producer相关API 1.1 SofaMQProducer SofaMQProduce…...

IIS 缓存, 更新后前端资源不能更新问题

解决办法: 通常只需要index.html 不缓存即可, 其他文件都是根据index.html 中的引用去加载; 正确的做法是在 站点下增加 web.config 文件, 内容如下: 我这个是因为目录下有个config.js 配置文件, 也不能缓存, 所以加了两个 <?xml version"1.0" encoding&quo…...

中科院罗小舟团队提出 UniKP 框架,大模型 + 机器学习高精度预测酶动力学参数

作者&#xff1a;李宝珠 编辑&#xff1a;三羊 中国科学院深圳先进技术研究院罗小舟团队提出了&#xff0c;基于酶动力学参数预测框架 (UniKP)&#xff0c;实现多种不同的酶动力学参数的预测。 众所周知&#xff0c;生物体内的新陈代谢是通过各种各样的化学反应来实现的。这…...

组件中写选项的顺序(vue的问题)

为什么选项要有统一的书写顺序呢&#xff1f;很简单&#xff0c;就是要将选择和认知成本最小化。 副作用 (触发组件外的影响) el全局感知 (要求组件以外的知识) nameparent组件类型 (更改组件的类型) functional模板修改器 (改变模板的编译方式) delimiterscomments模板依赖 (…...

LUA 对象转excel

1. 首先把LUA 转成JSON 对象 因为是excel, 所以第一层要是数组&#xff0c;否则没有什么意义&#xff0c;即lua对象要是一个数组比较合理。这里使用开源的json.lua&#xff0c; 但是开源的&#xff0c;对于数字作下标的&#xff0c;或者是一个数组里&#xff0c;不同类型的key…...

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口&#xff1a; JobMaster.onStart();部署 Task 链条&#xff1a;JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …...

openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramfromdata.c

文章目录 openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramfromdata.c概述笔记END openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramfromdata.c 概述 开源工程包含的头文件类型是.inc, 要重命名为.h, 否则没有c头文件语法提示 从数组中载入大数p,q,g 建立ossl…...

【k8s】Kubernetes技术和相关命令简介

一、 Kubernetes简介 Kubernetes是Google开源的一个容器编排引擎&#xff0c;它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时&#xff0c;通常要部署该应用的多个实例以便对应用请求进行负载均衡。kubernetes&#xff0c;简称K8s&#xff0…...

清晰光谱空间:全自动可调波长系统的高光谱成像优势

高光谱成像技术 高光谱成像技术是一种捕获和分析宽波长信息的技术&#xff0c;能够对材料和特征进行详细的光谱分析和识别。高光谱成像技术的实现通过高光谱相机&#xff0c;其工作原理是使用多个光学传感器或光学滤波器分离不同波长的光&#xff0c;并捕获每个波段的图像&…...

23.实战演练--个人主页

<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"true"an…...

[剪藏] - 任泽平年终演讲精华:点燃希望——2024中国经济十大预测

任泽平年终演讲精华&#xff1a;点燃希望——2024中国经济十大预测 泽平宏观 2023-12-23 08:01 发表于上海 12月22日22:30&#xff0c;任泽平年终秀“点燃希望乐观者前行——2024中国经济十大预测”圆满收官。 泽平宏观、北京广播电视台、上海高净值研究院、北京时间等携手打…...

基于LabVIEW的压力传感器测试系统

摘要 现在各类压力传感器已广泛应用于各种工业自控环境&#xff0c;对压力传感器的研究 及应用&#xff0c;既可以体现一个国家的科技发展水平&#xff0c;又可以提升国家的综合国力&#xff0c;还 可以在丰富、方便和智能化人们的生活方面做出重要的贡献。而针对不同仪器组 成…...

Vue 如何使用WebSocket与服务器建立链接 持续保持通信

WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求&#xff0c;链接建立后&#xff0c;客户端和服务器端就可以通过TCP链接直接交互数据。WebSocket链接后可以通过send()方法来向服务器发送数据&#xff0c;并通过onnessage事件来接受服务器返回的数据。 创…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...