JAVA只允许单继承,但是有的类同时具有两个货以上的类的特征,而接口正是解决JAVA类单继承的问题。关于JAVA接口,我们先总结几点说明,然后通过一个例子来对总结进行阐释
JAVA接口有以下几个特征:
①接口是抽象方法和常量值(public static final)的集合,之所以其成员变量都是public static final,这是为了修正C++多继承中容易出现的问题(多继承的多个父类之间如果有相同的成员变量,引用起来比较麻烦,而且容易出现各种问题)。接口中声明的属性默认是public static final,并且也只能是public static final,接口中只能定义抽象方法,并且这些方法默认是public,而且也只能是public。
②从本质上讲,接口是一种特殊的抽象类,这种抽象类只包含常量和方法的定义,而没有变量和方法的实现。
③多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口
④与继承关系类似,接口与实现类之间也存在多态现象。
⑤引入接口后,定义JAVA类的完整语法如下:
< modifier > class < name > [ extends < superClass > ] [ implements < interafce > [ , [ interface ] * ] ] {
< declarations >*
}
⑥接口还可以继承其他接口,并添加新的属性和抽象方法。
看下面实例:
以上的打印结果是:
student is sleeping
student is singing
teacher is sleeping
teacher is singing
teacher is eating
Teacher和Student都实现了Singer接口,但他们并没有什么关系,同时,Teacher实现了两个接口:Singer和Painter,而这两个类也是没有关系的。这也就验证了③。
关于④的解释:第60行,虽然s1指向的是一个Student类实例,但是,s1被编译器看做Singer类,所以s1就不能调用student中特有的属性或方法。亦即:
以上两句是错误的,myEclipse给出的错误提示在注释中。
63行代码:虽然Teacher同时实现了Singer接口和Painter接口,但由于s2被声明为Singer类,所以s2是不能访问Teacher的teach(),paint(),eat()和getName()方法的。
但是可以通过强制转换,把原来Singer的s2转换为Painter,这样就可以访问Painter的方法了。我们可以理解为某个对象声明为什么类,那么他就只能“看见”这个类的相关属性和方法。
这里,再补充另一个小例子,这是一个神奇的现象,不过暂时还没有找到解决办法:
上例中,TestInterface同时实现了A和B接口,而A和B接口又有相同的抽象方法 public double getMoney(); 然后在实现这两个接口时,我只写了一个getMoney(),并且这是可以通过编译的。
然而像下面这样就不对了:A和B接口拥有方法签名一样返回值不一样的getMoney()方法,如果只实现其中一个getMoney()是不对的,因为类要实现它所有接口中的所有方法,但是如果都想实现,也不对,因为同一个类中是不允许出现方法签名一样而返回值不一样的情况,因为无法区分这两个方法。。。。。。。。。。。