您的位置:首页 > 编程语言 > Java开发

Java's Interface自己的一点理解

2013-05-12 15:37 323 查看
此文章发表于前博客

 

Interface是程序设计的一种技术,在Java程序设计被大量使用。在Spring中,面向抽象编程的理念也是出自于Interface。

由于Java是完全面向对象的语言,所以学习Interface需要从类说起。

1) Java中如何使用Interface这种独特的类

Interface是一个类(Interface在实际的文件中也是以.java的形式存在的),但是与平时设计的类有所不同。Interface的所有方法均没有实现,直接看来,Interface很接近Abstract Class。

Java不允许一个子类继承多个父类(除非这个子类是Interface,J。Interface是静态的代码,不存在动态调用问题)。所以如果一个子类在继承了父类的所有方法之后仍然需要实现某些父类所没有的功能,要么子类可以自己构造自己的方法;但是如果已经有了一个Interface,子类可以在继承父类的情况下,实现这个接口。在C++等语言中,如果有另一个类有上述Interface的功能方法(即函数),那么子类可以即继承第一个父类,还可以继承第二个甚至第三个父类。

所以Java中用Interface的初衷,是因为曲线地实现多重继承功能。

2) 为什么Java不允许多重继承

       直观地说,如果子类son继承了父类father又继承了父类father2,如果father和father2都有一个方法me(),那么子类中类似super.me()应该是指向哪个方法?

       类似的多重继承一般称为钻石型继承。多重继承,至少在Java语法里,是会引起不确定因素的。Java通过接口的方式曲线实现了多重继承而不担心出现上面的错误,是因为Interface不可以实例化,也就不存在调用的错误可能性了。

       Java的子类的构造方法里,最首先的一句是父类的构造方法(如果有继承的话,其实Java里除了Object,其他所有类都有子类的身份)。所以,子类与父类的关系是“is-a”。因为父类伴随着子类,所以子类有所谓的“动态调用”的能力,因为子类存在的时候,父类也是存在的。

3) 为什么父类不把子类需要的所有方法都包含了

       或者你需要两个子类son和daughter,它们都继承自father,那么father如果包含了son的方法,则daughter也会拥有这样子的方法。这是不符合现实理念的。

       我们也可以把son所需要的father没有的方法写进son类里面,但是如果nephew类也有这些方法的实现,使用Interface就会方便很多。如果一个类动辄几千行,那么至少在查找代码上面这种机制会方便很多。

       而且如果在维护或者更新一个已经运作成功的系统,父类往往在设计的时候没有考虑后继的功能,而一个运作成功的代码,能够不去改动内部当然是好事。

4) Interface和抽象类有什么不一样

      这里讨论的不是继承的时候,用与不用接口;而是讨论,单纯继承去实现派生类的量产和单纯使用接口去实现派生类的量产的区别。

      比如:ClassRedDoor() implements Door&&Class RedDoor() extends Door

      Door即可以作为一个抽象类,也可以是一个接口。

       基本上这两者可以通用。但是理念是很不一样的。如果我们开发的程序需要后面的人研究再开发,是不可以混用这两种机制的。

       比如形状这种抽象的东西,定义了形状所拥有的基本的元素,三角形和四边形可以通过继承形状而实现。但是三角形可以判断是否是直角三角形,我们却不能要求一个形状去判断自己是否拥有直角。这是抽象类的本质,只定义了最本质的东西。

       而Interface是一些方法的集合。如上文所述。

       如果一个门有报警的功能,我们不使用Interface,而考虑在抽象类内定义Alert的抽象方法(你知道,为了重复使用代码,一般把代码写在父类而不是每个派生类自己写出来)。那么应该像这个样子:

       Abstract classDoor{…..alert();}这样就有种误会,这个门,到底是一个门,还是一个报警的门呢?是不是所有的门都有报警功能呢?(在(3)已经讨论过了)

       而如果单纯使用接口类似Interface Door{close();open();alert();}所有的门都可以close和open,那么如果我需要去产生一个类只可以close和open而不可以报警的呢?

       啰嗦了一大堆,其实意思就是,糅合这两种机制,会使得代码更加合理。我们可以让所有的门,不管什么门,都派生自门这一个类,但是部分门拥有的功能,我们可以用接口去概括。这两种机制一起使用,使得编程的灵活性大大增加了。

      备注:仅作为自己的总结。肯定有所错误请见谅。

      增加:抽象类可以有非抽象的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: