接口(interface)

2023-05-16

目录

一、简介

二、接口的使用

Ⅰ.使用interface来定义

Ⅱ.在Java中,接口和类是两个并列的结构

Ⅲ.如何定义接口:定义接口中的成员

①JDK7以及以前:只能定义全局常量和抽象方法

②JDK8中:除了定义全局常量和抽方法之外,还可以定义静态方法、默认方法

Ⅳ.接口中不能定义构造器

Ⅴ.Java开发中,接口通过让类去实现(implements)的方式来使用

Ⅵ.Java类可以实现多个接口 --->弥补了Java单继承性的局限性

Ⅶ.接口与接口之间可以继承,且可以多继承

Ⅷ.接口的具体使用,体现多态性,实际上可以看做是一种规范

#开发中,体会面向接口编程

⚪抽象类和接口有哪些异同?

三、创建接口匿名实现类的对象

四、接口的应用:代理模式

①概述

②应用场景

③分类

Ⅰ.静态代理(静态定义代理类)

Ⅱ.动态代理(动态生成代理类)

五、接口的应用:工厂模式

分类

①无工厂模式

②简单工厂模式(静态工厂模式)

③工厂方法模式

④抽象工厂模式

六、练习题

①排错

②排错


一、简介

  • 一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果
  • 另一方面,有时必须从几个类中抽取出一些共同的行为特征,而他们之间又没有is-a(子父类)的关系,仅仅有相同的行为特征而已
  • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能...”的思想。继承是一个“是不是”的关系,而接口实现则是“能不能”的关系
  • 接口的本质是契约、标准、规范。

二、接口的使用

Ⅰ.使用interface来定义

Ⅱ.在Java中,接口和类是两个并列的结构

Ⅲ.如何定义接口:定义接口中的成员

①JDK7以及以前:只能定义全局常量和抽象方法

全局常量:public static final  ,书写时可以省略  
抽象方法:public abstract,书写时可以省略  

②JDK8中:除了定义全局常量和抽方法之外,还可以定义静态方法、默认方法

Ⅳ.接口中不能定义构造器

接口不可以实例化

Ⅴ.Java开发中,接口通过让类去实现(implements)的方式来使用

如果实现类覆盖了接口中所有的抽象方法,则此实现类就可以实例化

如果实现类没有覆盖接口中所有的抽象方法则此实现类仍为一个抽象类

public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println(Flyable.MAX_SPEED);
		System.out.println(Flyable.MIN_SPEED);
//		Flayable.MIN_SPEED = 2;   不能对final字段 Flayable.MIN_SPEED 赋值
		
		Plane plane = new Plane();
		plane.fly();
		plane.stop();
	}
}



interface Flyable{
	//全局常量
	public static final int MAX_SPEED = 7900;  //第一宇宙速度
	int MIN_SPEED = 1;     // 可以省略public static final  
	
	//抽象方法
	public abstract void fly();
	void stop();   //可以省略public abstract  

//	public Flyable() {   接口不能具有构造函数
//		
//	}
	
}

class Plane implements Flyable{

	@Override
	public void fly() {
		System.out.println("通过引擎起飞");
		
	}

	@Override  //实现 java2.Flyable.stop
	public void stop() {
		System.out.println("驾驶员减速停止");
		
	}
}

abstract class Kite implements Flyable{

	@Override
	public void fly() {
		
	}
}

Ⅵ.Java类可以实现多个接口 --->弥补了Java单继承性的局限性

    格式:class AA extends BB implements CC,DD,EE

interface Attackable{
	
	void attack();
}

class Bullet implements Flyable,Attackable{

	@Override
	public void attack() {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void fly() {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void stop() {
		// TODO 自动生成的方法存根
		
	}
	
}

(继承父类后实现相应的接口) 

Ⅶ.接口与接口之间可以继承,且可以多继承

interface AA{
	void method1();
}
interface BB{
	void method1();
}
interface CC extends AA,BB{
	
}

Ⅷ.接口的具体使用,体现多态性,实际上可以看做是一种规范

/*
 * 接口的使用:
 * 1.接口使用上也满足多态性
 * 2.实际上就是定义了一种规范
 * 
 * */
public class USBTest {
	public static void main(String[] args) {
		Computer computer = new Computer();
		Flash flash = new Flash();
		computer.transferData(flash);
	}
}

interface USB{
	//常量:定义了长、宽、最大最小的传输速度等

	void start();

	void stop();
}

class Computer{
	public void transferData(USB usb) { //USB usb = new Flash();
		
		usb.start();
		System.out.println("具体传输数据的细节");
		usb.stop();
	}
}

class Flash implements USB{

	@Override
	public void start() {
		System.out.println("U盘开启工作");

	}
	@Override
	public void stop() {
		System.out.println("U盘结束工作");		
	}	
}

class Printer implements USB{

	@Override
	public void start() {
		System.out.println("打印机开启工作");		
	}
	@Override
	public void stop() {
		System.out.println("打印机结束工作");		
	}	
}

#开发中,体会面向接口编程

⚪抽象类和接口有哪些异同?

三、创建接口匿名实现类的对象

public class USBTest {
	public static void main(String[] args) {
		Computer computer = new Computer();

		//1.创建了接口的非匿名实现类的非匿名对象
		Flash flash = new Flash();
		computer.transferData(flash);

		//2.创建了接口的非匿名实现类的匿名对象
		computer.transferData(new Printer());

		//3.创建了接口的匿名实现类的非匿名对象
		USB phone = new USB() {

			@Override
			public void start() {
				System.out.println("手机开始工作");				
			}
			@Override
			public void stop() {
				System.out.println("手机结束工作");				
			}
		};

		//4.创建了接口的匿名实现类的匿名对象
		computer.transferData(new USB() {

			@Override
			public void start() {
				System.out.println("mp3开始工作");				
			}
			@Override
			public void stop() {
				System.out.println("mp3结束工作");				
			}			
		});
	}
}

四、接口的应用:代理模式

①概述

    代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问

public class NetWorkTest {
	public static void main(String[] args) {

		Server server = new Server();
		ProxyServer proxyServer = new ProxyServer(server);  //将server赋给属性NetWork
		proxyServer.browse();  //表面上是代理在执行,内部某些时候还是被代理在操作
	}
}

interface NetWork{
	public void browse();  //browse : 浏览

}


//被代理类
class Server implements NetWork{

	@Override
	public void browse() {
		System.out.println("真实的服务器访问网络");

	}	
}

//代理类
class ProxyServer implements NetWork{

	private NetWork work;

	public ProxyServer(NetWork work) {
		this.work = work;
	}

	public void check() {
		System.out.println("联网之前的检查工作");
	}

	@Override
	public void browse() {
		check();

		work.browse();
	}	
}


     1.测试类中,new了一个Server,然后把这个对象传递给了ProxyServer,然后用的是Work接收的对象引用,work再去调用的browse方法就会调用Server自己的

     2.传递被代理类对象给代理类,通过代理类去执行方法,执行的是被代理类的方法
     适用于不方便通过被代理类直接(Server)调用自身方法的情况

    3. 总之就是在代理类的方法内调用了被代理类的方法,但是前提是需要将接口对象的引用指向被代理类
       这也就是为什么代理类的构造器需要接口类型的参数,创建代理类对象的时候将被代理类的对象传过去就实现动态绑定了。

②应用场景

  1. 安全代理:屏蔽对真实角色的直接访问
  2. 远程代理:通过代理类处理远程方法调用(RMI)
  3. 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象

③分类

Ⅰ.静态代理(静态定义代理类)

Ⅱ.动态代理(动态生成代理类)

JDK自带的动态代理,需要反射等知识

五、接口的应用:工厂模式

实现了创建者与调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的

工厂:专门用来造对象

分类

①无工厂模式

②简单工厂模式(静态工厂模式)

用来生产同一等级结构中的任意产品,工厂类一般使用静态方法,通过接收参数的不同来返回不同的实例对象

缺点:对于增加新产品,不修改代码则无法扩展。违反了开闭原则(对扩展开放,对修改封闭)

③工厂方法模式

为了避免简单工厂模式的缺点,不完全满足OCP(对扩展开放,对修改封闭)。

用来生产同一等级结构中的固定产品

与简单工厂模式的区别:简单工厂模式只有一个(对于一个项目或者一个独立的模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类

④抽象工厂模式

与工厂方法模式的区别:需要创建对象的复杂程度

用意:用来生产不同产品族的全部产品

是最抽象、最具有一般性的

使用时需要满足的条件:

  1. 系统中有多个产品族,而系统一次只可能消费其中一族产品
  2. 同属于同一个产品族的产品一起使用

六、练习题

①排错

 父类中有x,接口中也有x(定义重名):编译不通过

接口和父类是平行关系  ——  就近原则

②排错

 Ball是final,不可以修改,违反了常量的赋值原则

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接口(interface) 的相关文章

  • 在 TypeScript 中实现接口原型

    我创建了一个TypeScript我的服务结果界面 现在我想为里面的两个函数定义一个基本功能 问题是我收到错误 Support 类型的值不存在属性 ServiceResult I use WebStorm为发展 VS2012让我紧张 因为大型
  • Typescript 为具有动态和静态键的对象创建接口

    我正在尝试学习打字稿 但在界面方面遇到了障碍 我有一个想要保存的对象token和一个route如下 const obj token thisismytoken path to somewhere 我在这里遇到的问题是 如何生成该对象的接口
  • Java 因实现访问权限较弱的接口方法而出现错误

    当我编译这段代码时 interface Rideable String getGait public class Camel implements Rideable int x 2 public static void main Strin
  • Kotlin:类继承了包含伴生对象的接口,但无法访问该接口的常量

    这是界面 interface SomeInterface companion object const val MY CONST the constant 然后 类 没有主体 因为只是一个例子 class SomeClass SomeInt
  • 何时实现接口以及何时扩展超类?

    我读了很多关于 Java 中的接口和类继承的文章 我知道如何做到这两点 并且我认为我对两者都有很好的感觉 但似乎没有人真正将两者并排比较 并解释何时以及为何要使用其中之一 我没有发现很多时候实现接口会比扩展超类更好 那么什么时候实现接口以及
  • 自定义字体和 XML 布局 (Android)

    我正在尝试在 Android 中使用 XML 文件定义 GUI 布局 据我所知 没有办法指定您的小部件应该在 XML 文件中使用自定义字体 例如您放置在 asset font 中的字体 并且您只能使用系统安装的字体 我知道 在 Java 代
  • 将对象转换为没有 TInterfacedObject 作为基类的接口类型

    我需要一个没有引用计数的实现接口的类 我做了以下事情 IMyInterface interface IInterface B84904DF 9E8A 46E0 98E4 498BF03C2819 procedure InterfaceMet
  • Python C-API 访问字符串常量

    我想使用 python 的 C API 在 C 语言中实现我为 python 编写的库 在 python 中 我可以通过声明以下内容在我的模块中声明 常量 RED red Not really a constant I know BLUE
  • 为一个参数指定多个接口

    我有一个实现两个接口的对象 接口是 public interface IObject string Name get string Class get IEnumerable
  • 创建 Javascript Api 接口

    我目前正在研究 php 中查询 sql 数据库的解决方案 但是 我希望其他网站能够查询数据库 或php中的函数 我搜索谷歌 但由于跨域策略 我认为 我无法找到如何将这些函数公开给javascript 有人知道我该怎么做吗 Try soap
  • 如何实现有效的 Java 特征?

    请告诉我这是否不合适 特别是 Programmers SE 或其他东西是否更适合这个问题 好吧 因此 我目前将许多 特征 表达为接口 我们称它们为 可更新 和 可破坏 将它们表达为接口的缺点是我无法在所有 可破坏 组件之间共享行为 另一方面
  • Moq-ing 类或接口有什么区别?

    我一直在使用moq http code google com p moq 在我的单元测试中模拟对象 我在关于最小起订量的网站上看到它能够模拟类和接口 有一天 我与我的一位同事进行了讨论 他们表示没有理由模拟类 我应该只模拟接口 我对此并没有
  • 设计决策:为什么以及何时将接口设为私有?

    设计决策中是否使用过私有接口 如果是这样 原因是什么 您什么时候知道需要私有接口 A 顶层接口不能是私有的 它只能有public或包访问 来自Java 语言规范 第 9 1 1 节 接口修饰符 https docs oracle com j
  • 如何将接口类型传递给过程

    如何将接口类型传递给过程参数 type Hello PortType interface ISoapInvokable 243CBD89 8766 F19D 38DF 427D7A02EAEE function GetDeneme s st
  • 在 C# 中将“set”添加到接口的属性中

    我希望通过为该接口中的属性提供设置访问器来 扩展 该接口 界面看起来像这样 interface IUser string UserName get 我想要这样的东西 interface IMutableUser IUser string U
  • 删除接口中的冗余类型

    我有以下接口 public interface IRevision
  • 继承接口方法的重新实现

    我不完全理解如何使用接口 所以我必须问 我使用 BaseClass 它实现了 IBaseClass 接口 这些接口仅包含一个声明 public interface IBaseClass void Refresh 所以我在我的 Basecla
  • php 中接口的用途是什么?

    如果我在 PHP 中定义一个接口 以及一个创建该接口实例的工厂类 有什么方法可以强制客户端代码仅使用该接口而不使用底层具体类 根据我的理解 客户也可以实际使用底层类中的任何公共函数 字段 这是一个例子
  • 让按钮更容易点击

    我有一个按钮 在某些手机上由于尺寸太大而很难点击 但让它变大会破坏布局 可以向视图解释它有一个比其可见区域更大的 点击框 吗 不确定这是否有帮助 如果您使用没有背景的 ImageButton 并设置 Padding 值 您的按钮将具有更大的
  • Android proguard Javascript 接口问题

    我的项目在使用 proguard 进行混淆后因 javascriptinterface 失败 这是包含混淆器配置的一些建议的链接 但它在我的情况下不起作用 http groups google com group android devel

随机推荐

  • JAVA 两数求商

    题目描述 xff1a 给定两个整数 a 和 b xff0c 求它们的除法的商 a b xff0c 要求不得使用乘号 除号 以及求余符号 注意 xff1a 整数除法的结果应当截去 xff08 truncate xff09 其小数部分 xff0
  • 约瑟夫环总结

    约瑟夫环 N个人围成一圈 xff0c 从第一个人开始报数 xff0c 报到m的人出圈 xff0c 剩下的人继续从1开始报数 xff0c 报到m的人出圈 xff0c 如此往复 问题一 xff1a 所有人都出圈 xff0c 求出圈的人的编号顺序
  • Linux操作系统实验:生产者和消费者问题

    一 实验目的及要求 生产者消费者 问题是一个著名的同时性编程问题的集合 通过编写经典的 生产者消费者 问题的实验 xff0c 读者可以进一步熟悉 Linux 中多线程编程 xff0c 并且掌握用信号量处理线程间的同步互斥问题 二 实验仪器设
  • COCO数据集解析

    1 简介 官方网站 xff1a http cocodataset org 全称 xff1a Microsoft Common Objects in Context xff08 MS COCO xff09 支持任务 xff1a Detecti
  • U盘启动盘cmd制作

    U盘 移动硬盘启动盘cmd手工制作 插入 gt 61 8G的u盘 移动硬盘 1 win 43 r打开运行窗口 xff0c 输入cmd回车打开命令行 xff08 命令提示符不分大小写 xff09 2 在DOS命令行窗口中输入 diskpart
  • 系统调用的概念和作用

    一 什么是系统调用 xff0c 有何作用 1 概念 用户接口 命令接口 允许用户直接使用 程序接口 允许用户通过程序间接使用 xff1a 由一组系统调用组成 系统调用 系统调用 是操作系统提供给应用程序 xff08 程序员 编程人员 xff
  • linux系统下键盘按键的重新映射——xmodmap工具和xev工具

    虽然linux下小键盘还是不能用 xff0c 但是找到一篇好文章 linux系统下键盘按键的重新映射 xmodmap工具和xev工具 文章目录 1 xev工具 xff1a 2 xmodmap工具 大家会不会有时候 xff0c 感觉键盘上的某
  • Sorry, you have been blocked(Chatgpt登录被屏蔽)

    解决办法 xff1a 关闭浏览器 xff0c 重新打开 vpn换个地区 xff0c 换个美国的vpn
  • Linux查看ip地址出错,ens33不显示inet解决

    在我的私人博客中也有写 xff0c 大家去看看哦 Linux 查看 ip 地址出错 xff0c ens33 不显示 inet 解决 白都 baidu2001 top 问题 xff1a 在 CentOS7中输入 ip addr 时 xff0c
  • Java多线程(超详解)

    目录 1 线程简介 1 1 程序 1 2 进程 1 3 线程 1 4 多线程 1 5 普通方法调用和多线程 2 线程创建 2 1 继承Thread类 2 2 实现Runnable接口 2 3 实现Callable接口 xff08 了解 xf
  • 学习Java的路线

    JavaSE 18 20天 xff09 数据库 xff08 4天 xff09 前端 xff08 7天 xff09 Javaweb xff08 7天 xff09 SSM框架 xff08 9天 xff09 Linux xff08 7天 xff0
  • Java常用类的使用方法小结

    文章目录 前言一 常用类有哪些 xff1f 二 常用类使用方法1 Object类0 xff09 所用的对象1 xff09 getClass方法2 xff09 hasCode方法3 xff09 toString方法4 xff09 equals
  • Java I/O流

    文章目录 前言一 什么是流 xff1f 二 流的分类1 根据流向来分1 xff09 输入流2 xff09 输出流 2 根据单位来分1 xff09 字节流2 xff09 字符流 3 根据功能来分1 xff09 节点流2 xff09 过滤流 三
  • Java 网络编程

    文章目录 前言一 什么是计算机网络 xff1f 二 网络通信的两个重要因素1 通讯双方的地址1 xff09 ip2 xff09 端口号 2 规则 xff1a 网络协议 三 Ip地址1 InetAddress2 Ip的分类1 xff09 ip
  • ScrumMaster的教练职责

    ScrumMaster是Scrum团队的敏捷教练 Ken Rubin说 xff0c 类似于运动团队的教练 xff0c ScrumMaster观察团队使用Scrum的过程 xff0c 帮助团队提高工作绩效 教练不是顾问 xff0c 不提供解决
  • Java多线程

    文章目录 前言一 多线程1 进程 xff0c 线程 xff0c 多线程2 继承Thread类1 xff09 同时下载多个网图通过继承Thread类 3 实现Runnable接口1 xff09 下载多个网图通过实现Runnable接口2 xf
  • MySQL数据库随笔

    提示 xff1a 本文章仅供个人学习使用 xff0c 如有错误请及时私信通知 文章目录 前言一 MySQL的基本操作命令 xff08 1 xff09 连接数据库 xff08 2 xff09 修改用户密码 xff08 3 xff09 刷新权限
  • mybiatis学习笔记

    mybiatis学习笔记参考于尚硅谷mybatis文档 96 提示 xff1a 这如果有错误的地方 xff0c 请联系博主已更正 xff0c 文章目录 mybiatis学习笔记参考于尚硅谷mybatis文档前言一 Mybatits的特性二
  • KVM 介绍及安装

    KVM 安装 KVM KVM 简介 KVM 全称是 Kernel based Virtual Machine 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案 xff0c 包含一个可加载的内核模块 kvm ko 提供和虚拟化核心
  • 接口(interface)

    目录 一 简介 二 接口的使用 使用interface来定义 在Java中 xff0c 接口和类是两个并列的结构 如何定义接口 xff1a 定义接口中的成员 JDK7以及以前 xff1a 只能定义全局常量和抽象方法 JDK8中 xff1a