接口02-Java

接口02

  • 一、接口与继承类
    • 1、引入
    • 2、总结
      • (1)接口和继承解决的问题不同。
      • (2)接口比继承更加灵活。
      • (3)接口在一定程度上实现代码解耦。
  • 二、接口的多态性
    • 1、多态参数
      • ① 回顾:继承中的多态
      • ② 接口的多态-案例1
      • ③ 接口的多态-案例2
    • 2、多态数组
    • 3、多态传递
  • 三、练习
  • 四、类定义的进一步完善

一、接口与继承类

1、引入

接口&继承
猴子类有爬树天性,小猴子继承了猴子类之后,它可以自动获得这个爬树方法。鸟类会飞,小猴子想飞就需要实现这个方法。

	class Monkey {
	    private String name;
	
	    public Monkey(String name) { this.name = name; }
	
	    public void climbing() { System.out.println("猴子会爬树");  }
	
	    public String getName() { return name; }
	}
	
	class LittleMon extends Monkey implements Fishable,Birdable{
	    public LittleMon(String name) { super(name); }
	
	    @Override
	    public void swimming() {
	        System.out.println("猴子:"+getName()+"通过学习,可以像鱼一样游泳");
	    }
	
	    @Override
	    public void flying() {
	        System.out.println("猴子:"+getName()+"通过学习,可以像鸟一样飞翔");
	    }
	}
	
	interface Fishable { void swimming(); }
	
	interface Birdable { void flying();}

当子类继承了父类,就自动的拥有父类的功能。
如果子类需要扩展功能,可以通过实现接口的方式扩展。
可以理解实现接口是对java单继承机制的一种补充。

2、总结

(1)接口和继承解决的问题不同。

继承的价值主要在于:解决代码的复用性和可维护性。
接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法,更灵活。

(2)接口比继承更加灵活。

接口比继承更加灵活,继承是满足is - a的关系,
而接口只需满足 like - a 的关系。

(3)接口在一定程度上实现代码解耦。

[即接口规范性+动态绑定]

讲集合的时候会深入理解。

二、接口的多态性

1、多态参数

① 回顾:继承中的多态

父类类型的变量a可以指向继承AAA的子类的 对象实例。

class AAA {}
class BBB extends AAA {}
class CCC extends AAA {}
【main】
AAA a = new BBB();
a = new CCC();

② 接口的多态-案例1

接口 IF 类型的变量 if01 可以指向实现了IF接口的 类的对象实例。

public class InterfacePolyParameter {
    public static void main(String[] args) {
        IF if01 = new Monster();
        if01 = new Car();
    }
}

interface  {}
class Monster implements IF {}
class Car implements IF {}

③ 接口的多态-案例2

在前面的Usb接口案例,Usblnterface usbinterface,既可以接收手机对象,又可以接收相机对象,就体现了接口多态(接口引用可以指向实现了接口的类的对象)。

前一篇文章中的 computer、usb、设备案例
work方法中:
① UsbInterface usbInterface形参是接口类型UsbInterface
② 实现了UsbInterface接口的类的对象实例,都可以传递参数

class Computer {
    public void work(UsbInterface usbinterface) {
        usbinterface.start();
        usbinterface.stop();
    }
}
public interface UsbInterface { //接口
    public void start();//开始工作
    public void stop();//停止工作
}
【main】
//创建手机,相机对象
Camera camera = newCamera();
Phone phone = new Phone();
//创建计算机
Computer computer = new Computer();
computer.work(camera);//把相机接入到计算机
computer.work(phone);//把手机接入到计算机

2、多态数组

回顾在学继承,多态数组定义为: 数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。

见之前的文章
https://blog.csdn.net/yavlgloss/article/details/134521052?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170115025416800182769750%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170115025416800182769750&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-2-134521052-null-null.nonecase&utm_term=%E5%A4%9A%E6%80%81&spm=1018.2226.3001.4450

  • 演示一个案例:
  • 给Usb数组中,存放 Phone和相机对象,Phone类还有一个特有的方法call(),请遍历Usb数组,如果是Phone对象,除了调用Usb接口定义的方法外,还需要调用Phone特有方法call。
  • InterfacePolyArr.java
public class InterfacePolyArr {
    public static void main(String[] args) {
        Usb[] usbs = new Usb[2];
        usbs[0] = new Phone_();
        usbs[1] = new Camera_();
        for (int i = 0; i < usbs.length; i++) {
            usbs[i].work();//动态绑定
            //向下转型
            if(usbs[i] instanceof Phone_) {//判断运行类型
                ((Phone_)usbs[i]).call();
            }
        }
    }
}

interface Usb{
    void work();
}
class Phone_ implements Usb{
    public void call() {
        System.out.println("打电话··");
    }

    @Override
    public void work() {
        System.out.println("手机工作中··");
    }
}
class Camera_ implements Usb{
    @Override
    public void work() {
        System.out.println("相机工作中··");
    }
}

3、多态传递

接口存在多态传递现象。 InterfacePolyPass.java

	interface IH {}
	interface IG extends IH {}
	class Teacher implements IG {}
	
	IG ig = new Teacher();
	IH ih = new Teacher();

如果IG继承了IH接口,而Teacher类实现了IG接口
那么,实际上就相当于 Teacher类也实现了IH接口

进一步理解这句话:
在这里插入图片描述
① hi一定是public ,一定可以被继承
② 此时在接口 IH 中添加了方法 hi(),IG 接口继承 IH,所以也继承了方法 hi。
③ Teacher类立马报错,要求实现 hi方法。
这就是所谓的接口多态传递现象。

三、练习

改错+分析输出

interface A{ int x = 0; }

class B{ int x = 1; }

class C extends B implements A {
	
	public void pX() { System.out.println(x); }
	
	public static void main(String[] args) { new C().pX(); }
	
}

我的答案:
接口中的 x 是 public static final 不可以更改,C同时拥有A的x和B的x 。。。不知道。。。

分析:
① interface A{ int x = 0; } 等价于 public static final int x = 0;
② class B{ int x = 1; } 这里的x是普通属性
③ public void pX() { System.out.println(x); }
这里的x指的是父类的x还是接口类的x呢? ==>会报错
【解决方法】:明确指定x
System.out.println(A.x); 访问接口中的静态x
System.out.println(super.x); 访问父类的x

四、类定义的进一步完善

在这里插入图片描述
类的五大成员(1)属性 (2)方法 (3)构造器 (4)代码块 (5)内部类


本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03

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

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

相关文章

银河麒麟v10——植物大战僵尸原版——2023教程

1、原版安装包如下&#xff1a; 阿里云盘分享https://www.alipan.com/s/Qn5DpDKs2YT 2、麒麟信息&#xff1a; 3、安装命令&#xff1a; 注意&#xff1a;最后一步&#xff0c;需要先解压tar包&#xff0c;再切到PlantsVsZombies.exe所在目录下&#xff0c;再执行启动命令&a…

Linux C/C++高级全栈开发(后端/游戏/嵌入式/高性能网络/存储/基础架构)

Linux C/C高级全栈开发是一个涉及到多个领域的综合性技术要求&#xff0c;需要对Linux系统、C/C编程语言以及各种相关的技术进行深入的理解和应用。 下面是一些涵盖的主要技术领域和技能要点&#xff1a; Linux系统基础&#xff1a;熟悉Linux操作系统的原理和常用命令&#xf…

命名管道:简单案例实现

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了什么是命名管道&#xff0c;匿名管道和命名管道的…

咨询+低代码,强强联合为制造业客户赋能

内容来自演讲&#xff1a;沈毅 | 遨睿智库 | 董事长 & 王劭禹 | 橙木智能 | 联合创始人 摘要 文章主要讲述了智库董事长沈毅创办广告公司的经历&#xff0c;以及他在管理公司过程中遇到的问题和挑战&#xff0c;最后通过与明道云以及橙木智能联合创始人王邵禹老师的合作&…

java二十章多线程

概念 有很多工作是可以同时完成的&#xff0c;这种思想放在Java中被称为并发&#xff0c;并发完成每一件事被称为线程。 程序员可以在程序中执行多个线程&#xff0c;每一个线程完成一个功能//与其他线程并发执行&#xff0c;这种机制被称为多线程&#xff0c;并不算所有编程…

如何提高3D建模技能?

无论是制作影视动画还是视频游戏&#xff0c;提高3D建模技能对于你的工作都至关重要的。那么如何能创建出精美的3D模型呢&#xff1f;本文给大家一些3D建模技能方面的建议。 3D建模通过专门的软件完成&#xff0c;涉及制作三维对象。这项技能在视频游戏开发、建筑、动画和产品…

FFmpeg架构全面分析

一、简介 它的官网为&#xff1a;https://ffmpeg.org/&#xff0c;由Fabrice Bellard&#xff08;法国著名程序员Born in 1972&#xff09;于2000年发起创建的开源项目。该人是个牛人&#xff0c;在很多领域都有很大的贡献。 FFmpeg是多媒体领域的万能工具。只要涉及音视频领…

【Vulnhub 靶场】【DriftingBlues: 9 (final)】【简单】【20210509】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/driftingblues-9-final,695/ 靶场下载&#xff1a;https://download.vulnhub.com/driftingblues/driftingblues9.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年05月09日 文件大小&#xff1a;738 …

达索系统SOLIDWORKS 2024工程图新功能

工程图概述 设计模型不仅能比绘制直线更快&#xff1b;SOLIDWORKS 从模型中生成工程图&#xff0c;模型的参数和几何关系在工程图中被保留&#xff0c;这样工程图可反映模型的设计意图&#xff1b;模型或工程图中的更改反映在其相关文件中&#xff0c;这样更改起来更容易&…

map文件解析

Map文件内容分为以下五段&#xff1a; 1&#xff09;Section Cross References&#xff1a;模块、段(入口)交叉引用&#xff1b;(ASR编译生成的map文件没有输出该段信息) 2&#xff09;Removing Unused input sections from the image&#xff1a;移除未使用的模块&#xff1…

【Linux】基础IO--文件基础知识/文件操作/文件描述符

文章目录 一、文件相关基础知识二、文件操作1.C语言文件操作2.操作系统文件操作2.1 比特位传递选项2.2 文件相关系统调用2.3 文件操作接口的使用 三、文件描述符fd1.什么是文件描述符2.文件描述符的分配规则 一、文件相关基础知识 我们对文件有如下的认识&#xff1a; 1.文件 …

java设计模式学习之【建造者模式】

文章目录 引言建造者模式简介定义与用途实现方式&#xff1a; 使用场景优势与劣势建造者模式在spring中的应用CD&#xff08;光盘&#xff09;的模拟示例UML 订单系统的模拟示例UML 代码地址 引言 建造者模式在创建复杂对象时展现出其强大的能力&#xff0c;特别是当这些对象需…

带大家做一个,易上手的家常炒鸡蛋

想做这道菜 先准备五个鸡蛋 然后将鸡蛋打到碗里面 然后 加小半勺盐 这个看个人喜好 放多少都没问题 不要太咸就好 将鸡蛋搅拌均匀 起锅烧油 油温热了之后 放三个干辣椒进去炒 干辣椒烧黑后 捞出来 味道就留在油里了 然后 倒入鸡蛋液 翻炒 注意翻炒 不要粘锅底 或者 一面糊…

嵌入式Linux:ARM驱动+QT应用+OpenCV人脸识别项目实现

一、前言&#xff1a; 这个项目主要分为两部分&#xff0c;客户端&#xff08;ARM板端&#xff09;负责利用OpenCV采集人脸数据&#xff0c;利用TCP将人脸数据发送给服务器&#xff0c;然后服务器根据人脸数据进行人脸识别&#xff0c;将识别后的结果返还给客户端&#xff0c;客…

【Linux】环境变量

文章目录 1. 环境变量的概念2. 常见的环境变量3. 查看环境变量的方法4. 测试PATH5. 和环境变量有关的命令6. 环境变量的组织方式7. 通过代码获取环境变量7.1 通过命令行的第三个参数7.2 通过第三方变量environ 8. 通过系统调用获取9. 环境变量的全局属性 1. 环境变量的概念 **…

函数指针数组指针数组传参的本质字符指针(进阶篇)

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;不服输的你&#xff0c;他们拿什么赢 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请点赞…

【带头学C++】----- 八、C++面向对象编程 ---- 8.5 struct结构体类型增强使用说明

目录 8.5 struct结构体类型增强使用说明 8.5.1 C结构体可以定义成员函数 8.5.2 c中定义结构体变量可以不加struct关键字 8.6 bool布尔类型关键字 8.5 struct结构体类型增强使用说明 第六章对结构体的使用、内存对齐以及数组、深拷贝和浅拷贝进行了一个详细的说明&#xff0c…

带键扫的LED专用驱动方案

一、基本概述 TM1650 是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用电路。内部集成有MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强&#xff0c;可适用于24 小时长期…

对抗产品团队中的认知偏误:给产品经理的专家建议

今天的产品经理面临着独特的挑战。他们不仅需要设计和构建创新功能&#xff0c;还必须了解这些功能将如何为客户带来价值并推进关键业务目标。如果不加以控制&#xff0c;认知偏差可能会导致您构建的内容与客户想要的内容或业务需求之间不一致。本文将详细阐述产品经理可以避免…

【EI会议征稿】第四届应用数学、建模与智能计算国际学术会议(CAMMIC 2024)

第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09; 2024 4th International Conference on Applied Mathematics, Modelling and Intelligent Computing 第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09;将于…