精通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 接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!