目录
1、接口的概念
2、定义接口
3、实现接口
4,对接口的引用
1、接口的概念
java中的接口(interface)在语法上有些相似于abstract类,他定义了若干个抽象方法和常量,这些方法通常对应与某一组功能,表示事物具有某方面的特性。
作用
- 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
- 通过接口可以指明多个类需要实现的公共方法。
- 通过接口可以了解对象的交互界面,而不需要了解对象所对象的类
帮助实现类似于多重继承的功能。
注:图片选自java程序设计第三版,唐大什
多重继承:指一个子类可以有一个以上的直接父类,该子类可以继承它所有直接父类的成员。JAVA不支持多重继承,而是用接口实现比多重继承更强的功能。
2、定义接口
java中声明接口的语法
[public] interface 接口名 [extends 父接口名列表]{
//接口体
//常量声明
[public] [static] [final] 类型 变量名=常量名;
//抽象方法声明
[public] [abstract] 返回值 方法名(参数列表) [throws异常列表];
}
通常接口名依able或ible结尾。
接口中包括字段及方法,与类中的字段与方法有不同之处:
- 接口中的字段实际上是常量,字段前即使省略修饰符,任然默认为public、static、final。
- 接口中的方法都是抽象方法,不能有实现体;方法前面即使省略修饰符,仍然默认为public、abstract。
事实上,定义接口时,一般都省略字段和方法的修饰符。
接口也具有继承性。定义一个接口时可通过extends关键字声明该新接口是某个已经存在的父接口的派生借口,它将继承父类接口的所有字段和方法。与类的继承不同的是,一个接口可以有一个以上的父接口,他们之间用逗号分隔,形成父接口列表。新接口将继承所有父接口中的属性和方法。
interface Collection{
int MAX_NUM=100;
void setadd();
/*
该例定义了一个名为collection的接口
声明了一个常量和一个方法。
*/
}
3、实现接口
一个类要实现接口时,请注意以下问题。(可以看一下)
- 在类的声明部分,用implements关键字声明该类将要实现哪些接口。
- 如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法。如果其直接或间接父类中实现了接口,父类所实现的接口中的所有抽豪方法都必须有实在的方法体。也就是说,非抽象类中不能存在抽象方法。
- 一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。否则,只是在重载一个新的方法,而不是实现已有的抽象方法。
- 接口的抽象方法的访问限制符都已指定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。
- 最好在实现接口的方法前面使用@Override以让编译器更好地检查该方法。
- 一个类只能有一个父类,但是它可以同时实现若干个接口。一个类实现多个接口时,在implements子句中用逗号分隔。这种情况下如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。
例如
interface Runner{
void run();
}
interface Swimmer{
void swim();
}
interface Flyable{
void gly();
void land();
void takeoff();
}
/*上面定义了三个接口,分别名为Runner,Swimmer,Flyable*/
abstract class Animal{
int age;
abstract public void eat();
}
/*定义了一个抽象类*/
class Flyman extends Animal implements Runner,Flyable,Swimmer
{
@Override
public void run()
{
System.out.println("run");
}
@Override
public void swim()
{
System.out.println("swim");
}
@Override
public void gly()
{
System.out.println("gly");
}
@Override
public void land()
{
System.out.println("land");
}
@Override
public void takeoff()
{
System.out.println("takeoff");
}
@Override
public void eat()
{
System.out.println("eat");
}
}
public class Main
{
public static void main(String[] args)
{
Main p=new Main();
Flyman t=new Flyman();
p.m1(t);
p.m2(t);
p.m3(t);
}
private void m3(Animal t)
{
t.eat();
}
private void m2(Swimmer t)
{
t.swim();
}
private void m1(Runner t)
{
t.run();
}
}
程序中定义了三个接口和一个抽象类,并让一个类来继承这个抽象类并实现这三个接口。
4,对接口的引用
接口可以作为一种引用类型来使用。接口类型的变量可以引用到任何实现该接口的类的实例,通过该变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定该使用哪个类中的方法。
把接口作为一种数据类型可以不需要了解对象所对应的具体的类,而着重于它的交互界面,仍以前面所定义的接口Collection和实现该接口的类Queue为例,下例中,以Collection作为引用类型来使用
class InterfaceType{
public static void main(String args[]){
Coolection c=new Queue();
c.add(obj);
}
}