﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-guomingzhang2008-文章分类-Java</title><link>http://www.blogjava.net/guomingzhang2008/category/44295.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 04 May 2010 14:58:36 GMT</lastBuildDate><pubDate>Tue, 04 May 2010 14:58:36 GMT</pubDate><ttl>60</ttl><item><title>接口和抽象类的区别总结</title><link>http://www.blogjava.net/guomingzhang2008/articles/315513.html</link><dc:creator>张国明</dc:creator><author>张国明</author><pubDate>Mon, 15 Mar 2010 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/guomingzhang2008/articles/315513.html</guid><wfw:comment>http://www.blogjava.net/guomingzhang2008/comments/315513.html</wfw:comment><comments>http://www.blogjava.net/guomingzhang2008/articles/315513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/guomingzhang2008/comments/commentRss/315513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/guomingzhang2008/services/trackbacks/315513.html</trackback:ping><description><![CDATA[<p>接口内可以有成员，凡是接口内声明的变量，就算不用任何修饰符，都默认是public stastic final的。</p>
<p><br />
&nbsp;<br />
抽象类：包括大多数派生类所具有的功能(具体实现类似)<br />
接口：包括某些类(甚至不相关的类)所类似的功能(具体实现可以不同)<br />
抽象类:家用电器<br />
派生类:冰箱，洗衣机，电视，收音机...<br />
接口：开关<br />
实现接口的类:电视，收音机，水龙头，马桶...</p>
<p>关于这个，其实全部用接口也不是不可以，但是如果全部用接口，那么所有的继承类都将自己实现所有的方法，这个有时候是不必要的，将大大的增加程序员的工作量以及设计上的错误<br />
比如有个接口Person，有个方法叫做sayHello，只是简单的打印一个sayHello（表示打个招呼吧），Person接口下面有两个子类SomeConcretePerson1，SomeConcretePerson，当然这两个子类也会继承这两个方法，但是由于是Person是接口，两个子类必须自己实现打印sayHello，这个明显会重复代码，何不在把Person改为抽象类，实现sayHello方法呢？</p>
<p>abstract class Person{<br />
&nbsp;&nbsp; sayHello(){System.out.println("hello!")};<br />
}<br />
SomeConcretePerson1 extends Person{};<br />
SomeConcretePerson2 extends Person{};<br />
------------------------------------<br />
interface Person{<br />
&nbsp;&nbsp; sayHello();<br />
}<br />
SomeConcretePerson1 extends Person{<br />
&nbsp;&nbsp;&nbsp; sayHello(){System.out.println("hello!")};//这里明显跟下面是重复的代码<br />
};<br />
SomeConcretePerson2 extends Person{<br />
&nbsp;&nbsp;&nbsp; sayHello(){System.out.println("hello!")};//如果不小心还有可能两个打印不同的东西<br />
}</p>
<p>所以可以看到java api很多类顶层只是一个抽象类而不是接口，比如Object<br />
每个类都是继承Object，如果Object是一个接口，想想你自己写的类将要实现多少在Object里面定义的方法？没有这个必要了<br />
还有一个很好的例子是MouseListener跟MouseAdapter,前者是接口，后者是抽象类，该抽象类是继承MouseListener，并且所有方法体为空，在具体应用上，由于implements MouseListener将必须实现所有的方法，有时候可能并不需要，可能只需要相应一个mouseClicked事件就够了，其他事件不用管，这时候你只需要extends MouseAdapter,然后overridemouseClicked方法即可，这个就是很好的应用了，不用全部实现接口的所有方法<br />
&nbsp;<br />
声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。<br />
接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/guomingzhang2008/archive/2009/10/05/4632877.aspx</p>
<img src ="http://www.blogjava.net/guomingzhang2008/aggbug/315513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/guomingzhang2008/" target="_blank">张国明</a> 2010-03-15 19:40 <a href="http://www.blogjava.net/guomingzhang2008/articles/315513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>