4.13 接口
程序员文章站
2022-07-15 08:51:53
...
4.13 接口
Java不支持多继承性(即子类只能有一个父类),为了克服单继承的缺点,Java使用了接口,一个类可以实现多个接口。
1.接口的声明与使用
1)接口声明
interface 接口名;
2)接口体
包含常量定义和方法定义两部分。接口中只进行方法的声明,不提供方法的实现,所以方法的定义没有方法体,且用分号“;”结尾。如:
interface Printable{
fianl int MAX=100;
void add();
float sum(float x,float y);
}
3)接口的使用
一个类通过使用关键字implements声明自己使用一个或多个接口。如果使用多个接口,用逗号隔开接口名。如:
class A implements Printable,Addable
class Dog extends Animal implements Eatable,Sleepable
如果一个类使用了某个接口,那么这个类必须实现该接口所有的方法。需要注意的是:在实现接口的方法时,方法的名字、返回类型、参数个数及类型必须与接口中的完全一致。
特别需要注意的是:接口中的方法默认是public abstract方法,所以实现的方法也要用public来修饰,而且接口中常量默认是public static常量。
由于接口体中只有常量定义和public的abstract方法定义,允许省略常量前面的public、final和static修饰,和方法前面的public和abstract修饰。
例:
interface Computable{
int MAX=100; //允许省略public、final和static
int f(int x); //允许省略public和abstract
}
class China implements Computable{
int number;
public int f(int x){ //不要忘记public关键字
int sum=0;
for(int i=0;i<=x;i++)
sum+=i;
return sum;
}
}
class Japan implements Computable{
int number;
public int f(int x){
return 44+x;
}
}
public class InterfaceExample{
public static void main(String args[]){
China china=new China();
Japan japan=new Japan();
china.number=765+Computable.MAX;//也可以用类名或接口名直接调用
japan.number=326+Computable.MAX;
System.out.println("number:"+china.number+"求和"+china.f(100));
System.out.println("number:"+japan.number+"求和"+japan.f(100));
}
}
类实现的接口的方法以及接口中的常量可以被类的对象调用,而且常量也可以用类名或接口名直接调用。
接口声明时:加上public,就是public接口;不加public,就是友好接口类。
如果父类使用了某个接口,那么子类也就自然的使用了该接口,不必再使用关键字implements声明自己使用这个接口。
接口也可以被继承,由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
注:如果一个类声明实现一个接口,但没有实现接口中的所有方法,那么这个类必须是abstract类。如:
interface Computable{
int MAX=100;
void speak(String s);
int f(int x);
}
abstract class A implements Computable{
public int f(int x) {
int sum=0;
for(int i=0;i<=x;i++)
sum+=i;
return sum;
}
}
2.理解接口
假如轿车,货车,拖拉机、摩托车、客车都是机动车的子类,如果机动车有两个抽象方法:“收取费用”和“调节温度”,那么所有的子类都要实现这两个方法,但是拖拉机、摩托车不需要“收取费用”或“调节温度”功能,而货车、客车都需要“收取费用”或“调节温度”功能。
接口可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系。
3.接口回调
可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量中。
那么该接口变量就可以调用被类实现的接口中的方法。
例:
interface ShowMessage{
void show(String s);
}
class TV implements ShowMessage{
public void show(String s){
System.out.println(s);
}
}
class PC implements ShowMessage{
public void show(String s){
System.out.println(s);
}
}
public class InterfaceCallbackExample{
public static void main(String args[]){
ShowMessage sm; //声明接口变量
sm=new TV(); //接口变量中存放对象的引用
sm.show("长城电视机"); //接口回调
sm=new PC();
sm.show("联想电脑");
}
}
4.接口做参数
如果一个方法的参数是接口类型,就可以将任何实现该接口类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。
interface SpeakHello{
void speakHello();
}
class Chinese implements SpeakHello{
public void speakHello(){
System.out.println("你好");
}
}
class English implements SpeakHello{
public void speakHello(){
System.out.println("Hello");
}
}
class KindHello{
public void lookHello(SpeakHello hello) { //接口类型参数
hello.speakHello(); //接口回调
}
}
public class InterfaceExample2{
public static void main(String args[]){
KindHello kindHello=new KindHello();
kindHello.lookHello(new Chinese());
kindHello.lookHello(new English());
}
}
转载于:https://my.oschina.net/jerrypan/blog/130115