JAVA之interface

来源:互联网 发布:dc大事件 知乎 编辑:程序博客网 时间:2024/05/16 13:33

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()是不对的,因为类要实现它所有接口中的所有方法,但是如果都想实现,也不对,因为同一个类中是不允许出现方法签名一样而返回值不一样的情况,因为无法区分这两个方法。。。。。。。。。。。


原创粉丝点击