精通Java接口的使用与原理

接口基础知识

为什么需要接口

需求:要求实现防盗门的功能,门有“开”和“关”的功能,锁有“上锁”和“开锁”功能。
分析:首先防盗门是一个门,它有一把锁。按照之前学过的面向对象的思想,可以将门和锁分别定义成抽象类。但是,不能让防盗门在继承们的同时又继承锁。原因有两点:第一,防盗门不是锁,不符合继承中is a的关系,第二,Java只支持单继承,如何解决这个问题呢?这时就要用到接口,可以将锁定义为接口,让防盗门继承门,实现锁的接口。那么什么是借口呢?它的特点又是什么呢?下面让我们来学习一下。

什么是接口

在生活中,接口是一套规范,只要满足这个规范的设备,就可以将它们组装到一起,从而实现该设备的功能。
而在软件中,接口同样是一种规范和标准,它们可以约束类的行为,是一些方法特征的集合,但是没有方法的实现,从这个角度来讲,接口可以看作一种特殊的“抽象类”,但是采用与抽象类完全不同的语法来表示,两者的设计理念也是不同的,抽象类利于代码的复用,接口利于代码的扩展和维护。

接口的定义语法和类实现接口的语法

[修饰符] interface 接口名 extends 父接口1,父接口2,…{
//常量定义
//方法定义
}
class 类名 extends 父类名 implements 接口1,接口2,…{
//类成员
}

接口说明
1.接口的命名规范和类相同。
2.接口中可以定义常量,不能定义变量。
3.接口中所有的方法都是抽象方法。
4.和抽象类一样,接口也不能实例化,接口中不能有构造方法。
5.接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
6.接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。

下面就使用Java接口来模拟生活中的USB接口

//先定义USB接口,通过service()方法提供服务
/*
 * USB接口
 */
public interface UsbInterFace {
	/*
	 * USB接口提供服务
	 */
	void service();
}

//定义U盘类,实现USB接口中的service()方法,进行数据传输
/*
 * U盘
 */
public class UDisk implements UsbInterFace{
	public void service(){
		System.out.println("连接USB口,开始传输数据");
	}

}

//定义USB风扇类,实现USB接口中的service()方法,获得电流使风扇转动
/*
 * USB风扇
 */
public class UsbFan implements UsbInterFace{
	public void service(){
		System.out.println("连接USB口,获得电流,风扇开始转动");
	}
}
//编写测试类,实现U盘传输数据,使USB风扇转动
/*
 * 测试类
 */
public class Test {

	public static void main(String[] args) {
		//1.U盘
		UsbInterFace uDisk=new UDisk();
		uDisk.service();
		//2.USB风扇
		UsbInterFace usbFan=new UsbFan();
		usbFan.service();
	}
}

运行结果:

通过该示例我们学习了如何定义接口和实现接口,这些技能在后面的学习中将会被反复用到。

接口表示一种能力

使用接口实现防盗门功能

通过上面的代码,我们已经了解Java接口的语法和规则,现在就使用借口来实现防盗门功能

//定义Door类,具有开和关的功能
/*
 * 门
 */
public abstract class Door {
	public abstract void open();//开
	public abstract void close();//关
}

//定义Lock接口,具备上锁和开锁的功能
/*
 * 锁,接口
 */
public interface Lock {
	void lockUp();//上锁
	void openLock();//开锁
}

//定义TheftproofDoor类,继承Door类,实现Lock接口
*
 * 防盗门类
 */
public class TheftproofDoor extends Door implements Lock,DoorBell{
	public void lockUp() {
		System.out.println("插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙");
	}
	public void openLock(){
		System.out.println("插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙");
	}
	public void open(){
		System.out.println("用力推,门打开了");
	}
	public void close(){
		System.out.println("轻轻拉门,门关上了");
	}
}

//编写测试类,实现防盗门的关门,开门,上锁,开锁的功能
/*
 * 测试类
 */
public class DoorTest {
	public static void main(String[] args) {
		TheftproofDoor tfd=new TheftproofDoor();
		tfd.close();//关门
		tfd.lockUp();//上锁
		tfd.takePictures();//来访客人拍照存储
		tfd.openLock();//开锁
		tfd.open();//开门
	}
}

运行结果:

通过上面的案例我们了解了接口表示一种能力,一个类实现了某个接口,就表示这个类具备了某种能力,那我们就为防盗门增加一个拍照存档的功能,当主人不在家有客人来访时便会自动拍照存储。

/*
 * 门铃接口
 */
public interface DoorBell {
	void takePictures();//铃响拍照存档功能
}

//为防盗门增加门铃功能
/*
 * 防盗门类
 */
public class TheftproofDoor extends Door implements Lock,DoorBell{
//省略其他实现方法
public void takePictures(){
		System.out.println("铃......咔嚓......照片已存储");
	}
}

//修改测试类,代码如下:
/*
 * 测试类
 */
public class DoorTest {
	public static void main(String[] args) {
		TheftproofDoor tfd=new TheftproofDoor();
		tfd.close();//关门
		tfd.lockUp();//上锁
		tfd.takePictures();//来访客人拍照存储
		tfd.openLock();//开锁
		tfd.open();//开门
	}
}

运行结果:

接口表示一种约定

使用接口实现打印机打印功能

需求:要求实现打印机打印功能。打印机的墨盒可能是彩色的,也可能是黑白的,所有的纸张可以有很多类型。
代码如下:

//定义墨盒接口InkBox,约定墨盒有颜色
/*
 * 墨盒接口
 */
public interface InkBox {
	/*
	 * 得到墨盒颜色
	 */
	public String getColor();
}

//定义纸张接口Paper,约定纸张有大小
/*
 * 纸张接口
 */
public interface Paper {
	/*
	 * 得到纸张大小
	 */
	public String getSize();
}

//定义打印机类,引用墨盒接口,纸张接口实现打印功能
/*
 * 打印机类
 */
public class Printer {
	InkBox inkBox;//墨盒
	Paper paper;//纸张
	/*
	 * 设置打印机墨盒
	 */
	public void setInkBox(InkBox inkBox){
		this.inkBox=inkBox;
	}
	/*
	 * 设置打印机纸张
	 */
	public void setPaper(Paper paper){
		this.paper=paper;
	}
	/*
	 * 使用墨盒在纸张上打印
	 */
	public void print(){
		System.out.println("使用"+inkBox.getColor()+"墨盒在"+paper.getSize()+"纸张上打印");
	}
}

//墨盒厂商按照InkBox接口实现ColorInkbox类和GrayInkBox类
/*
 * 彩色墨盒
 */
public class ColorInkBox implements InkBox{
	public String getColor(){
		return "彩色";
	}
}
/*
 * 墨色墨盒
 */

public class GrayInkBox implements InkBox{
	public String getColor(){
		return "黑色";
	}
}
/*
 * 墨色墨盒
 */

public class GrayInkBox implements InkBox{
	public String getColor(){
		return "黑色";
	}
}
/*
 * 墨色墨盒
 */

public class GrayInkBox implements InkBox{
	public String getColor(){
		return "黑色";
	}
}
//纸张厂商按照Paper接口实现A4Paper类和B5Paper类
public class A4Paper implements Paper{
	public String getSize(){
		return "A4";
	}
}
public class B5Paper implements Paper{
	public String getSize(){
		return "B5";
	}

}
//“组装”打印机,让打印机通过不同的墨盒和纸张实现打印
public class TestInkBox {
	public static void main(String[] args) {
		//1.定义打印机
		InkBox inkBox=null;
		Paper paper=null;
		Printer printer=new Printer();

		//2.使用黑白墨盒在A4纸上打印
		inkBox=new GrayInkBox();
		paper=new A4Paper();
		printer.setInkBox(inkBox);
		printer.setPaper(paper);
		printer.print();

		3.使用彩色墨盒在B5纸上打印
		inkBox=new ColorInkBox();
		paper=new B5Paper();
		printer.setInkBox(inkBox);
		printer.setPaper(paper);
		printer.print();

		//4.使用彩色墨盒在A4纸上打印
		paper=new A4Paper();
		printer.setPaper(paper);
		printer.print();
	}
}

运行结果:

在C#中使用接口

使用C#实现打印功能

语法

[修饰符] interface 接口名:父接口1,父接口2,…{
属性定义
方法定义
}
class 类名:父类名,接口1,接口2,…{}

c#接口说明
1.接口之间可以通过“:”来实现继承关系,一个接口可以继承多个接口,但接口不能继承类。类只能继承一个父类,但可以实现多个接口,使用“:”来继承类并实现接口
2.接口定义零个或多个成员,成员主要是方法,属性和索引器。借口中不能包含常量,变量和构造方法,也不能包含任何静态成员。
3.接口成员访问权限是public,定义接口时显式指定任何修饰符都是非法的。
4.按照惯例,c#中接口的名称以大写字母“I”开头。

下面用c#实现打印机案例,通过对比其中的一同,更好的掌握接口在两种语法中的应用。

namespace InterfaceDemo
{
    public interface InkBox
    {
        string Color { get; }
    }
    public interface Paper
    {
        string Size { get; }
    }
    class Printer
    {
        InkBox inkBox;//墨盒
        public InkBox InkBox
        {
            set { inkBox = value; }
        }
        Paper paper;//纸张
        public Paper Paper
        {
            set { paper = value; }
        }
        public void print()
        {
            Console.WriteLine("使用" + inkBox.Color + "墨盒在" + paper.Size + "纸上打印");
        }
    }
    public class ColorInkBox: InkBox
    {
        public string Color { get { return "彩色"; } }
    }
    public class GrayInkBox: InkBox
    {
        public string Color { get { return "黑白"; } }
    }
    public class A4Paper : Paper
    {
        public string Size { get { return "A4"; } }
    }
    public class B5Paper : Paper
    {
        public string Size { get { return "B5"; } }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            InkBox inkBox = null;
            Paper paper = null;
            Printer printer = new Printer();

            inkBox = new GrayInkBox();
            paper = new A4Paper();
            printer.InkBox = inkBox;
            printer.Paper = paper;
            printer.print();

            inkBox = new ColorInkBox();
            paper = new B5Paper();
            printer.InkBox = inkBox;
            printer.Paper = paper;
            printer.print();

            paper = new A4Paper();
            printer.Paper = paper;
            printer.print();
            Console.ReadLine();
        }
    }
}

运行结果:

在Java与c#两种语言中,接口具有以下区别
1.Java中通过extends来继承父接口,类通过implements实现接口;c#中通过":"来实现这两个功能。
2.Java接口中的成员变量都是常量,自动用public static final修饰;c#接口中不允许存在成员变量,但可以有属性。
3.Java接口中属性和方法都可以用public修饰;c#中默认用public,但不允许显式使用public修饰。
4.Java接口中可以定义静态变量和方法;c#接口中不允许包含任何静态成员。

到此这篇关于精通Java接口的使用与原理的文章就介绍到这了,更多相关Java 接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java接口的本质解析

    目录 接口 接口的定义 接口和抽象的区别

  • Java抽象类和接口使用梳理

    目录 抽象类 抽象方法 抽象类三大原则 接口 接口使用原则 JDK两大内置接口 java.lang.Comparable 比较接口 java.lang.Cloneable 克隆接口 对象的深浅拷贝 抽象类和接口的区别 抽象类 什么是抽象类呢?在现实生活中,我们说“人类”,我们无法对应到具体某个人,同样的,“动物类”.“图形类”这些无法映射到具体的对象的类就是抽象类. 抽象类是普通类的超集,意思就是普通类有的抽象类也有,只是它比普通类多了一些抽象方法而已.这些抽象方法可以有一个,也可以有多个. 它

  • Java中的接口多继承机制

    目录 问题原因 一个接口可以同时继承多个接口 接口不能实现任何接口 一个类可以实现多个接口 一个类只能继承一个父类 总结: 问题原因 今天在看集合源码的时候,突然看到接口继承接口,觉得有点差异,以前写代码也就是类继承一个类,实现接口.这样写的多了,突然看到接口继承接口就有点诧异了,以为哪里不对.就测试,查阅了一些资料 一个接口可以同时继承多个接口 书写接口测试 public interface Jiekou extends Jiekou1,Jiekou2{ void jiekou(); } pu

  • Java接口回调的本质详解

    本质是JVM指令invokevirtual它涉及到了多态的特性,使用 virtual dispatch 做方法调用 virtual dispatch 机制会首先从 receiver(被调用方法的对象的实际类型)的类的实现中查找对应的方法,如果没找到,则去父类查找,直到找到函数并实现调用,而不是依赖于引用的类型. 我们知道了接口回调的本质是多态,多态的本质是JVM的invokevirtual指令,那么我们就不用拘泥于接口和抽象类或者继承关系这种概念了,我们直接写一个用普通类实现的回调然后再分析它:

  • java提供的4种函数式接口

    目录 1.什么是函数式接口 2.java提供四种类型的函数式接口 1.什么是函数式接口 函数接口是只有一个抽象方法的接口,用作 Lambda 表达式的类型.使用@FunctionalInterface注解修饰的类,编译器会检测该类是否只有一个抽象方法或接口,否则,会报错.可以有多个默认方法,静态方法. 有且只有一个抽象方法的接口 场景: 适用于函数式编程场景(使用lambda表达式编程)的接口,函数式接口可以适用于lambda使用的接口. 只有确保接口中有且只有一个抽象方法,java中的lamb

  • Java入门基础之抽象类与接口

    目录 一.抽象类 1.什么是抽象类 2.语法规则 3.抽象类的作用 二.接口 1.什么是接口 2.语法规则 3.实现多个接口 4.接口之间的继承 三.接口的使用实例 1. Comparable 接口 2.Comparator接口 3.Clonable接口 四.总结 一.抽象类 1.什么是抽象类 首先我们来回顾一下上一篇文章提到的一个例子:打印图形 class Shape { public void draw() { // 啥都不用干 } } class Cycle extends Shape {

  • Java中接口Set的特点及方法说明

    目录 接口Set的特点及方法 Set接口及其实现类 Set接口有两个实现类 Set接口:Set存储元素是无序不可以重复的 因为Set接口也是Collection的子接口 1.TreeSet:树状集合.存放有序 2.HashSet:散列集合.高效快速 接口Set的特点及方法 1.特点:无序,不可重复: 2.实现类:添加的方法: add(Object obj); addAll(Collection c); Set中没有修改的方法,可以间接修改,先删除再添加: 删除的方法: remove(Object

  • Java中的抽象类和接口你了解吗

    目录 抽象类 什么是抽象类? 抽象类属于什么类型? 抽象类怎么定义? 抽象类是干什么的? 什么是抽象方法? 非抽象类继承抽象类 抽象类总结 接口 接口的基础语法 接口的实现 接口和多态联合使用 继承和实现同时出现 接口在开发中的作用 类型和类型之间的关系 总结 抽象类 什么是抽象类? 类和类之间有共同特征,将这些共同特征提取出来进一步抽象,就形成了抽象类.由于类是不存在的,所以抽象类无法创建对象. 抽象类属于什么类型? 抽象类也属于引用数据类型. 抽象类怎么定义? [修饰符列表] abstrac

  • 精通Java接口的使用与原理

    接口基础知识 为什么需要接口 需求:要求实现防盗门的功能,门有“开”和“关”的功能,锁有“上锁”和“开锁”功能.分析:首先防盗门是一个门,它有一把锁.按照之前学过的面向对象的思想,可以将门和锁分别定义成抽象类.但是,不能让防盗门在继承们的同时又继承锁.原因有两点:第一,防盗门不是锁,不符合继承中is a的关系,第二,Java只支持单继承,如何解决这个问题呢?这时就要用到接口,可以将锁定义为接口,让防盗门继承门,实现锁的接口.那么什么是借口呢?它的特点又是什么呢?下面让我们来学习一下. 什么是接口

  • 精通Java泛型的使用与原理

    目录 泛型之前 通过继承设计通用程序 泛型 Java泛型的实现原理 原始类型 突破泛型约束 泛型方法的类型推断 正确的运转 泛型相关问题 1.泛型类型引用传递问题 2.泛型类型变量不能是基本数据类型 3.运行时类型查询 4.泛型在静态方法和静态类中的问题 泛型相关面试题 1. Java中的泛型是什么 ? 使用泛型的好处是什么? 2.Java的泛型是如何工作的 ? 什么是类型擦除 ? 3. 什么是泛型中的限定通配符和非限定通配符 ? 4. List<? extends T>和List <?

  • Java接口DAO模式代码原理及应用详解

    DAO模式是接口的一个典型应用. 1. StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同? 二者都用于记录学生信息并且都声明了StudentDao接口,但StudenDaoListImpl.java使用ArrayList动态数组实现,使其内存可改变:而StudentDaoArrayImpl.java使用数组来储存学生信息,其数组长度是不变的. 2. StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有? Student

  • Java十分钟精通接口的使用与原理

    何为接口? 官方解释: Java内的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 个人理解解释: 其实接口可以理解为一种特殊的类,这个类里面全部是由全局常量和**公共的抽象方法(需要重写)所组成.接口是解决Java无法使用多继承的一种手段.我们可以把接口理解为是一个100%的抽象类,既接口中的方法必须全部是抽象方法.反正接口里面都是方法,但是没有方法体,其他类实现这个接口后重

  • Java接口和抽象类原理详解

    这篇文章主要介绍了Java接口和抽象类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一

  • 入门到精通Java SSO单点登录原理详解

    目录 1. 基础概念 2. 单点登录 3. CAS 流程 4. OAuth 流程 5. CAS和OAuth的区别 1. 基础概念 SSO单点登录(Single sign-on) 所谓单点登录就是在多个应用系统中,用户只需登录一次就可以访问所有相互信任的系统. CAS 中央认证服务(Central Authentication Service) CAS是由美国耶鲁大学发起的一个企业级开源项目,旨在为WEB应用系统提供一种可靠的单点登录解决方案(WEB SSO). OAuth2.0 开放授权(Ope

  • Java反射机制概念、原理与用法总结

    本文实例讲述了Java反射机制概念.原理与用法.分享给大家供大家参考,具体如下: 反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射机制能做什么 反射机制主要提供了以下功能: ① 在运行时判断任意一个对象所属的类: ② 在运行时构造任意一个类的对象: ③ 在运行时判断任意一个类所具有的成员变量和方法: ④ 在运行时调用任意一个

  • Java编程Iterator迭代器设计原理及实现代码示例

    我们知道迭代器(Iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素.那么Iterator迭代器的设计原理是什么呢?迭代器问什么定义了一个借口,而不是一个类呢? 我们假设迭代器迭代数据的功能定义为了一个类,那么,会有这样的问题.不同的集合,由于数据结构不一样,所以他们的存储方式也是不一样的.也就是说,迭代器获取的时候,获取的方式是变化的,也就是不固定的.所以把这种方式定义为具体的实现是不合理的. 无论何种集合,他们肯定都有获取的功能,而且不知道什么时候就没有数据了.所有他

  • MyBatis接口的简单实现原理分析

    用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅举个简单例子来说明原理,不是完全针对MyBatis的,这种思想我们也可以应用在其他地方. 定义一个接口 public interface MethodInterface { String helloWorld(); } 实现动态代理接口 public class MethodProxy<T> implements Invocati

  • java中注解机制及其原理的详解

    java中注解机制及其原理的详解 什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解.它主要的作用有以下四方面: 生成文档,通过代码里标识的元数据生成javadoc文档. 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证. 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码. 运行时动态处理,运行时通过代码里标识

随机推荐