1.接口的概念
--接口可以理解为一种特殊的类,有全局常量和公共的抽象方法所组成。
--类是一种具体实现体,接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。
--定义接口不再使用class关键字,而是使用interface关键字。
2.接口定义的基本语法:
[修饰符] interface 接口名 [extends 父接口1,父接口2...]
{
零个到多个常量定义...
零个到多个抽象方法的定义
}
--接口就是用来被继承、被实现的,修饰符一般建议用public。
注意:不能使用private 和protect 修饰接口
interface前一定有一个abstract关键字,如果没写,系统会自动加上abstract。
--接口可以继承多个父接口。(与普通类不同,类是单继承的)
--接口中的属性是常量,及时定义时不添加public static final 修饰符,系统也会自动加上。
--接口中的方法只能是抽象方法,总是使用,及时定义时不添加public abstract修饰符,系统也会自动加上。
3. 使用接口
一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个父类,不够灵活,通过实现多个接口可以做补充。
4. 继承父类实现接口的语法为:
[修饰符] class 类名 extends 父类 implements 接口1,接口2...
{
类体部分//如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。
}
-- 如果要继承父类,继承父类必须在实现接口之前
5.例子
//定义一个Telephone类:
package com.yinyong;
public abstract class Telephone {
public abstract void Call();//抽象方法没有方法体,以分号结束。
public abstract void Message();
}
//定义一个接口IPlayGame :
package com.yinyong;
public interface IPlayGame {
public void playGame();//接口里的函数不能有函数体。
}
/*
接口类也属于抽象类,定义接口时可以加上abstract关键字,public interface IPlayGame{...},如果不写abstract系统也会自动给加上abstract的,所以一般不用写。
*/
//接口中的方法也都是抽象方法。
//定义一个SmartPhone类,实现接口IPlayGame:
package com.yinyong;
public class smartPhone extends Telephone implements IPlayGame{
@Override
public void Call() {
// TODO Auto-generated method stub
System.out.println("语音实现打电话");
}
@Override
public void Message() {
// TODO Auto-generated method stub
System.out.println("语音实现发短信");
}
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("智能手机具有了玩游戏的功能");
}
}
//定义一个游戏机Psp类(不属于手机,但是可以玩游戏)
package com.yinyong;
public class Psp implements IPlayGame {
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("游戏机具有了玩游戏的功能");
}
}
//测试类,main()函数:
package com.yinyong;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Telephone obj2 = new SmartPhone();
obj2.Call();
obj2.Message();
IPlayGame ipg1 = new SmartPhone();//定义一个接口的引用指向实现了接口的对象
IPlayGame ipg2 = new Psp();//定义一个接口的引用指向实现了接口的对象
ipg1.playGame();
ipg2.playGame();
}
}
以上程序输出结果如下:
语音实现打电话
语音实现发短信
智能手机具有了玩游戏的功能
游戏机具有了玩游戏的功能
使用匿名内部类的方式实现接口
6.接口与匿名内部类配合使用
接口在使用过程当中,还经常与匿名内部类配合使用。
匿名内部类:就是没有名字的内部类,多用于关注实现而不关注实现类的名称。
语法格式:
Interface i = new Interface(){
public void method(){
System.out.println("匿名内部类实现接口的方式");
}
};
例子:
如,在上面的main函数中 ,添加如下代码:
IPlayGame ipg3 = new IPlayGame(){
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("使用匿名内部类的方式实现接口");
}
};
ipg3.playGame();
输出结果如下:
语音实现打电话
语音实现发短信
智能手机具有了玩游戏的功能
游戏机具有了玩游戏的功能
使用匿名内部类的方式实现接口
//还可以直接new接口来实现:
//接着上面的程序,在main函数中加如下代码:
new IPlayGame(){
@Override
public void playGame() {
// TODO Auto-generated method stub
System.out.println("直接new接口使用匿名内部类方式实现接口");
}
}.playGame();
程序输出为:
语音实现打电话
语音实现发短信
智能手机具有了玩游戏的功能
游戏机具有了玩游戏的功能
使用匿名内部类的方式实现接口
直接new接口使用匿名内部类方式实现接口