Java面向对象编程——接口

        接口是个比抽象类更抽象的一个抽象类

上个文章讲解了抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更特殊的"抽象类"——接口(interface).

        接口中不能包含普通方法,这与抽象类不同,在接口中,所有的方法必须都是抽象的。接口的概念就是建立在封装的基础之上而接口的继承,多态以及接口在实际开发中的普遍应用,足以让其java面向对象特点为一体。

大家有的有U盘,平时将文件资料放在里面,平时使用时可以将其与计算机上的usb接口进行连接,点开U盘所在的文件夹即可对U盘中的内容进行查阅,但是有没有想过,U盘的品牌,容量各不相同,为什么计算机能够识别,并且都能提供一个或多个盘符,供用户操作呢?其实,这就是接口的应用了

        对于 USB 接口来说,只需要规定任何一个 U 盘连接时,必须实现读和写的功能,而
不需要关注 U 盘是哪家厂商制造的,容量是多少。它需要关注的是,对于任意一款 U 盘来
说,是否满足 USB 接口定义的规范,如果是就能识别与操作它。由此可见,能正常使用的U 盘必然实现了 USB 接口制定的规范。

让规范和实现相分离,就是使用接口的主要目的,更进一步说,有了接口,可使软件系统中各组件之间面向接口耦合,这是一种松耦合的设计,为系统提供更好的可扩展性和可维护性。可以说,接口使得即插即用在程序中成为可能。因此,接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口通常定义一组公用的未实现的方法。

        定义一个接口需要使用interface关键字,定义语法如下

[public] interface 接口名 [extends 父接口名]{
    类型 常量字段名 = 值;
    ...
    返回类型 方法名(参数列表);
    ...    
}

        那我们来创建一个USB接口和两个实现类

package com.wangzilong.Interface;
//USB接口
public interface USB {
	//读的抽象方法
	public void read();
	//写的抽象方法
	public void write();
}

package com.wangzilong.Interface;


//金士顿U盘
public class Kingston implements USB {

	
    //实现USB中的抽象方法read()
	public void read() {        
		System.err.println("金士顿U盘正在读取信息!");

	}

	
    //实现USB中的抽象方法write()
	public void write() {
		System.out.println("金士顿U盘正在写入信息!");

	}

}

package com.wangzilong.Interface;
//苹果mp3
public class Apple implements USB {

	//实现USB中的抽象方法read()
	public void read() {
		System.out.println("苹果MP3正在读取信息");

	}

	//实现USB中的抽象方法write()
	public void write() {
		System.out.println("苹果MP3正在写入信息");

	}

}

        对于USB接口来说,其中有两个抽象方法read()和write(),注意这两个方法由于被放置在接口中,所以不需要再声明为abstract即己为抽象方法。Kingston类和Apple类分别实现了接口,实现了其中的抽象方法。为了生产这些产品,我们继续编写代码,创建一个简单的工厂类。

package com.wangzilong.Interface;
/*
 * USB生产厂类,可生产U盘,mp3等元件
 */
public class UsbFactory {
	public static USB createUsb(String type) {
		//创造一个USB类型的变量
		USB usb;
		//就收并对比字符串参数type的值,判断创建的是什么样的USB元件
		if ("kingston".equals(type)) {	//如果type与字符串“Kingston”相等,则执行方法体代码
			usb = new Kingston();	//对象实例化
		} else if ("apple".equals(type)) { //如果type与字符串“apple”相等,则执行方法体代码
			usb = new Apple();		//对象实例化
		} else {					
			usb = null;
			// 报告错误
		}
		return usb;		//返回usb的值
	}
}

        在UsbFactory类中,静态方法createUsb()通过接收并对比字符串参数type的值,来决定创建什么养的USB兼容元件。如果传递过来的是"kingston",则创建金士顿U盘;如果传递来的是“apple”,则创建苹果mp3;如果什么也没有传递,就不创建任何对象,并报告错误。

下面对这些类测试

package com.wangzilong.Interface;

public class Test {
	public static void main(String[] args) {
		// 用工厂创建U盘,注意是面向接口而不是具体类的
		USB usb;
		usb = UsbFactory.createUsb("kingston");		//"接口"实例化
		usb.read();								
		usb.write();
		// 用工厂创建mp3
		usb = UsbFactory.createUsb("apple");		//"接口"实例化
		usb.read();
		usb.write();
	}
}

        在mian()方法中,使用UsbFactory工厂创建了U盘对象及mp3对象,均由接口USB引用,我们程序不在面向某个或某某些对象,而是面向接口运转的。

运行结果如下

        对于该例子还需要注意一点,就是所有实现类在实现接口中的抽象方法时,其修饰符必须时public。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值