Java中的接口

  在具体讨论这个问题前,我们简单回顾一下什么是接口:

    根据《Java编程语言(第三版)》中第4章的描述,接口(Interface)――以一种抽象的形式定义类型作为方法或者其他类型的集合,从而形成该类型的约定。

    仔细学习以后,心中还是有一些疑问:

    1. 为什么要使用接口?

    2. 什么情况下需要使用接口?

    3. 接口和抽象类的区别有哪些?

    带着上面的问题我开始寻找答案。

    首先,为什么要使用接口。大家都知道类是对实际对象的抽象,而且为了避免由于类继承而带来的“菱形”问题,所以Java只支持单继承,但是接口支持多继承,为什么接口不会产生“菱形”问题呢,因为接口中并没有实现方法,而是由类实现,所以即使有“菱形”问题的存在,JRE也不会产生疑惑。而且,由于接口不包含实现,所以可以把接口看成比类更加抽象的类型,即:可以被多个类进行不同的实现。

    其次,什么情况下需要使用接口。权威的描述大家可以参考《Java编程语言(第三版)》中第4.6节的描述,根据我的理解就是:当在分析/设计阶段只能够确定对象可以具有某种职责,但是在实现(被类实现)以后才能够确定具体的工作内容。比如:Java对多线程的支持,可以通过实现Runnable接口,并且实现run方法。事先无法知道那些代码需要进行多线程处理,只有在实现了Runnablerun方法以后,JRE才能够根据我们的意思进行执行。

    最后,接口和抽象类的区别有哪些。第一,接口的属性(域)都是隐含的publicstaticfinal,也就是说只能在接口中声明常量;第二,接口的方法都是隐含的publicabstract,而且不能有nativesynchronizedstrictfp修饰符,因为接口方法还没有被实现。

    至此,对接口的了解从理论的角度来说似乎比较清晰了,但是怀着打破沙锅――问(纹)到底的心态,我又查阅了SUN提供的源代码,更有一番收获!

    我从Cloneable接口下手,发现该接口只是一个空声明,连任何属性或方法的声明都没有,在Object类中也只有一个声明,声明中包括protectednative修饰符,而且会抛出CloneNotSupportedException异常,也就是说当你需要实现对象的clone方法,需要首先要让类实现Cloneable接口(如果不实现该接口,编译可以通过,但是运行时JRE会抛出异常),而后通过重载clone方法,如果没有特殊要求可以直接返回super.clone()即可,因为有了native修饰符以后,该方法由JRE来处理,就象以前用C语言捕获键盘中断一样。那么为什么要protected呢?我考虑可能是因为:如果对象没有什么特殊的地方,可以直接在类中以public方式重载,但是如果有特殊需求则可以在重载的clone方法中进一步处理,这样既保证了clone的透明性,而且让程序员可以清楚的知道“对象需要clone了,要注意是否需要其他处理”。OK,这个空接口的目的就是让JRE知道该对象是否具备clone的能力。我还参看了RunnableComparable基本上大同小异,只不过它们包含了方法,我想可以通过设计模式中的“专家”和“纯虚构”模式进行解释。

    颇有收获呀,现在感觉对Java接口的理解有一些入门了,罗嗦一大堆,希望大家不要介意!

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值