接口
学过继承我们知道,利用继承使我们在设计程序、实现类的类的扩展时更加的简单方便,并且我们使得我们代码更加有层次感。但是我们知道继承是只允许进行单继承,这在我们解决一些问题时很不方便,为了实现“多继承”,Java给出了接口。
接口通过interface关键字进行创建,创建接口包括声明和实现接口体两个步骤。
声明跟声明类类似: interface 接口名 或 public interface 接口名
友好型的接口只允许同包内实现,public型则可以异包实现。
接口体:
接口体包括常量定义和方法定义两个部分。
常量定义时必须以public final 修饰(可以省略不写,但不代表它们不存在);方法定义时必须用public abstract修饰(也可以省略),具体的方法体不需要给出;
接口的使用:
类通过implements关键字实现接口,一个类可以实现多个接口,不同的接口只需用“,”隔开即可。假设A、B为接口,C是实现接口A、B的类:
class C implements A,B{
....
}
如果一个类实现了一个接口,那么该类的子类也实现了该接口,但是这个子类不必显式的表达出来(即不需要再盖子类的后边写“implements ……”)
实现接口的类必须重写接口中的所有方法,并且必须以public 修饰重写后的方法。如果实现该接口的类没有重写接口的所有方法,那么该类必须是抽象类。
接口回调:
接口回调跟对象的上转向变量类似,假如A为接口,C是实现接口A的类。如果把C的对象的引用赋给A的声明的变量a,那么a就能调用C中实现的方法。这就是接口回调。
接口的多态:
不同的类在实现同一个接口时也就通过不同的方式实现了该接口的方法,使得这几个同名的方法在通过接口回调使用后会产生不同的结果,这就是接口的多态。继续举上一次继承的多态时用过的例子:
package com.mfs.test;
public interface Animal{
public abstract void cry() ;
}
class Dog implements Animal{
public void cry() {
System.out.println("汪汪");
}
}
class Cat implements Animal{
public void cry() {
System.out.println("喵喵");
}
}
public class Example {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal animal = new Dog();
animal.cry();
animal = new Cat();
animal.cry();
}
}
结果:
可以看到通过抽象类的继承和接口都可以使设计者在设计者设计程序时只考虑操作不考虑实现,但是具体要用哪一个来实现还要具体问题具体分析,看是否需要“多继承”等方面