1.接口基础知识
1.为什么需要接口
2.什么是接口?
语法:
[修饰符] interface 接口名 extends 父接口1,父接口2,......{
//常量定义
//方法定义
}
语法:
class 类名 extends 父类名 implements 接口1,接口2,.......{
//类成员
}
说明:1.接口的命名规则与类相同。如果修饰符是public,则该接口在整个项目中可见;如果省略修饰符,则该 接口只在当前包可见。
2.接口中可以定义常量,不能定义变量。接口中的属性都会自动用public static final修饰,即接口中 的属性都是全局静态常量。接口中的常量必须在定义时指定初始值。
public static final int PI = 3.14;
int PI = 3.14;//在接口中,这两个定义语句效果完全相同
int PI;//错误!在接口中必须指定初始值,在类中会有默认值
3.接口中所有方法都是抽象方法。接口中方法都会自动用public abstract 修饰,即接口中只有全局抽 象方法。
4.和抽象类一样,接口也不能实例化,接口中不能有构造方法。
5.接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
6.接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
一个类只能有一个直接父类,但可以通过implements实现多个接口。当类在继承父类的同时又实现了多个接口时,extends关键字必须位于implements关键字之前。
在现实生活中,USB接口相关工作是按照如下步骤进行的:
1.约定USB接口标准
2.制作符合USB接口约定的各种具体设备
3.将USB设备插到USB接口上进行工作。
按照以上步骤,先定义USB接口,通过service()方法通过服务,代码如下:
/**
*USB接口
*/
public interfce 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();
}
}
以上代码声明了接口UsbInterface,实例化其实现类Udisk类和UsbFan类,遵循了多态中向上 转型的规则。
2.接口表示一种能力
1.使用接口实现防盗门功能
经过USB接口的模拟,我们已经了解了Java接口的语法和规则,现在就使用接口来实现防盗门功能。
防盗门是一个门,符合is a 的关系,可以抽象出一个门类。防盗门有一把锁,代表它有“上锁”和“开锁”的能力,表达的是has a 的关系,这里可以将锁定义成接口,让防盗门继承门类实现锁接口。具体步骤如下:
1.定义抽象类Door类,具有开和关的功能。
2.定义Lock接口,具备"上锁"和"开锁"的能力。
3.定义TheftproofDoor类,继承Door类的同时实现Lock接口。
4.编写测试类,实现防盗门的开,关和上锁,开锁的功能。
定义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 Look{
@Override
public void lockUp(){
System.out.println("插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙 。");
}
@Override
public void openLock(){
System.out.println("插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥 匙");
}
@Override
public void open(){
System.out.println("用力推,门打开了。");
}
@Override
public void close(){
System.out.println("轻轻拉门,门关上了。");
}
}
编写测试类,实现防盗门的关门、上锁、开锁和开门的功能,代码如下:
/**
*测试类
*/
public class DoorTest{
public static void main(String [] args){
//创建具体防盗对象
TheftproofDoor tfd = new TheftproofDoor();
tfd.close();//关门
tfd.lockUp();//上锁
tfd.openLock();//开锁
tfd.open();//开门
}
}
运行结果如下:
轻轻拉门,门关上了。
插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。
插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙。
用力推,门打开了。
通过以上案例我们理解了接口表示一种能力。一个类实现了某个接口,就表示这个类具备了 某种能力。
例如,当客人来访时,只要来人轻按门铃,便自动拍照存储。需要再为防盗门增加一种能力 ,其实现如示例所示:
/**
*门铃接口
*/
public interface DoorBell{
void takePictures();//拍照存档功能
}
为防盗门增加门铃的功能,代码如示例:
public class TheftproofDoor extends Door implements Lock,DoorBell{
//省略其他实现方法
@Override
public void takePictures(){
System.out.println("铃......咔嚓......照片已存储");
}
}
修改测试类,代码如下:
/**
*测试类
*/
public class DoorTest{
public ststic void main(String [] args){
//创建具体防盗对象
TheftproofDoor tfd = new TheftproofDoor();
tfd.close();//关门
tfd.lockUp();//上锁
tfd.takePictures();//来访客人拍照存储
tfd.openLock();//开锁
tfd.open();//开门
}
}
运行结果如下:
轻轻拉门,门关上了。
插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。
铃......咔嚓......照片已存储
插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙。
用力推,门打开了。
3.接口表示一种约定
1.使用接口实现打印机打印功能
4.在C#中使用接口
1.使用C#实现打印机打印功能
C#中打印接口的语法如下:
语法:
[修饰符] interface 接口名;父接口1,父接口2,......{
属性定义
方法定义
}
语法:
class 类名;父类名,接口1,接口2,......{}
说明:
1.接口之间可以通过冒号“:”来实现继承关系,一个接口可以继承多个接口,但接口不能继承类。类只能继承一个父类,但可以实现多个接口,使用冒号“:”来继承类并实现接口。
2.接口定义零个或多个成员,成员主要是方法、属性和索引器。接口中不能包含常量、变量或构造方法,也不能包含任何静态成员。
3.接口中成员访问权限是public,定义接口时显示指定任何修饰符都是非法的。
4.按照惯例,C#中接口的名称以大写字母“I”开头。
5.在Java与C#两种语言中,接口具有以下区别:
1.Java中接口通过extends来继承父接口,类通过implements实现接口;C#中通过冒号“:”来实现这两个功能。
2.Java接口中的成员变量(属性)都是变量,自动用public static final修饰;C#接口中不允许存在成员变量,但可以有属性。
3.Java接口中属性和方法都可以使用public 修饰;C#中默认为public,但不允许显式使用public修饰。
4.Java接口中可以定义静态常量和方法,C#接口中不允许包含任何静态成员。