﻿<?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-绺-随笔分类-程序钟摆 </title><link>http://www.blogjava.net/sorry0208/category/37403.html</link><description>梦在远方，路在脚下</description><language>zh-cn</language><lastBuildDate>Mon, 09 Feb 2009 03:14:36 GMT</lastBuildDate><pubDate>Mon, 09 Feb 2009 03:14:36 GMT</pubDate><ttl>60</ttl><item><title>抽象类与接口</title><link>http://www.blogjava.net/sorry0208/archive/2009/02/03/253061.html</link><dc:creator>栗衙</dc:creator><author>栗衙</author><pubDate>Tue, 03 Feb 2009 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/sorry0208/archive/2009/02/03/253061.html</guid><wfw:comment>http://www.blogjava.net/sorry0208/comments/253061.html</wfw:comment><comments>http://www.blogjava.net/sorry0208/archive/2009/02/03/253061.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sorry0208/comments/commentRss/253061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sorry0208/services/trackbacks/253061.html</trackback:ping><description><![CDATA[<p style="margin: 12pt 0cm 3pt"><span style="font-family: 宋体"><font size="5"><strong>抽象类与接口</strong></font></span></p>
<p style="margin: 17pt 0cm 16.5pt; text-indent: 0cm"><strong><font size="6"><font face="Times New Roman"><img height="513" alt="" src="http://p13.freep.cn/p.aspx?u=v20_p13_p_0902031212377003_0.jpeg" width="849" align="baseline" border="0" /></font></font></strong></p>
<p style="margin: 17pt 0cm 16.5pt; text-indent: 0cm"><strong><font size="6"><font face="Times New Roman">1 </font><span style="font-family: 宋体">定义</span></font></strong></p>
<p style="margin: 17pt 0cm 16.5pt; line-height: normal"><span style="font-weight: normal; font-size: 10.5pt; font-family: 宋体">抽象类：所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。</span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-family: 宋体">例如</span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><img height="79" alt="" src="http://img02.picoodle.com/img/img02/3/2/2/carmen0208/t_MyCatchm_09ad17d.jpg" width="138" border="0" /></p>
<p style="margin: 17pt 0cm 16.5pt; text-indent: 0cm"><font size="6"><strong><font face="Times New Roman">2 </font><span style="font-family: 宋体">语法</span></strong></font></p>
<p style="margin: 13pt 0cm; text-indent: 0cm"><font size="5"><font face="Arial"><strong>2.1 abstract class</strong></font></font></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">可以有自己的数据成员</span></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">有非</span><span style="font-size: 12pt"><font face="Times New Roman">abstarct</font></span><span style="font-size: 12pt; font-family: 宋体">的成员方法</span></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">继承关系，一个类只能使用一次继承关系</span></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">可以赋予方法的默认行为</span></strong></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt; font-family: 宋体">因为如果后来想修改类的界面（一般通过</span><span style="font-size: 10pt"><font face="Times New Roman">abstract class</font></span><span style="font-size: 10pt; font-family: 宋体">或者</span><span style="font-size: 10pt"><font face="Times New Roman">interface</font></span><span style="font-size: 10pt; font-family: 宋体">来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过</span><span style="font-size: 10pt"><font face="Times New Roman">abstract class</font></span><span style="font-size: 10pt; font-family: 宋体">来实现的，那么可能就只需要修改定义在</span><span style="font-size: 10pt"><font face="Times New Roman">abstract class</font></span><span style="font-size: 10pt; font-family: 宋体">中的默认行为就可以了。</span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 10pt; font-family: 宋体">同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了</span><span style="font-size: 10pt"><font face="Times New Roman">"one rule</font></span><span style="font-size: 10pt; font-family: 宋体">，</span><span style="font-size: 10pt"><font face="Times New Roman">one place"</font></span><span style="font-size: 10pt; font-family: 宋体">原则，造成代码重复，同样不利于以后的维护。因此，在</span><span style="font-size: 10pt"><font face="Times New Roman">abstract class</font></span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt"><font face="Times New Roman">interface</font></span><span style="font-size: 10pt; font-family: 宋体">间进行选择时要非常的小心。</span></p>
<p style="margin: 13pt 0cm; text-indent: 0cm"><font size="5"><font face="Arial"><strong>2.2 interface</strong></font></font></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">只能够有静态的不能被修改的数据成员</span></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">所有的成员方法都是</span><span style="font-size: 12pt"><font face="Times New Roman">abstract</font></span><span style="font-size: 12pt; font-family: 宋体">的</span></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">实现关系，一个类却可以实现多个</span><span style="font-size: 12pt"><font face="Times New Roman">interface</font></span></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><strong><span style="font-size: 12pt; font-family: 宋体">不可以赋予方法的默认行为</span></strong></p>
<p style="margin: 17pt 0cm 16.5pt; text-indent: 0cm"><strong><font size="6"><font face="Times New Roman">3 </font><span style="font-family: 宋体">设计理念</span></font></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><span style="font-weight: normal; font-size: 12pt"><font face="Times New Roman">abstarct class</font></span><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">：父类和派生类之间必须存在</span><span style="font-weight: normal; font-size: 12pt"><font face="Times New Roman">"is a"</font></span><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">关系，即父类和派生类在概念本质上应该是相同的</span></p>
<p style="margin: 13pt 0cm; text-indent: 0cm"><strong><font size="5"><font face="Arial">3.1 interface</font></font></strong></p>
<p style="margin: 3pt 0cm; line-height: normal; tab-stops: 21.0pt"><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">不要求</span><span style="font-weight: normal; font-size: 12pt"><font face="Times New Roman">interface</font></span><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">的实现者和</span><span style="font-weight: normal; font-size: 12pt"><font face="Times New Roman">interface</font></span><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">定义在概念本质上是一致的，</span><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">仅仅是实现了</span><span style="font-weight: normal; font-size: 12pt"><font face="Times New Roman">interface</font></span><span style="font-weight: normal; font-size: 12pt; font-family: 宋体">定义的契约而已</span></p>
<p style="margin: 17pt 0cm 16.5pt; text-indent: 0cm"><strong><font size="6"><font face="Times New Roman">4 </font><span style="font-family: 宋体">实例</span></font></strong></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">AlarmDoor</font></span><span style="font-size: 10pt; font-family: 宋体">在概念本质上是</span><span style="font-size: 10pt"><font face="Times New Roman">Door</font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt; font-family: 宋体">同时它有具有报警的功能</span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">abstract class Door { </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">abstract void open(); </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">abstract void close()</font></span><span style="font-size: 10pt; font-family: 宋体">；</span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">} </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">interface Alarm { </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">void alarm(); </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">} </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">class AlarmDoor extends Door implements Alarm { </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">void open() { &#8230; } </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">void close() { &#8230; } </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">void alarm() { &#8230; } </font></span></p>
<p style="margin: 2.8pt 0cm 5.65pt"><span style="font-size: 10pt"><font face="Times New Roman">} </font></span></p>
 <img src ="http://www.blogjava.net/sorry0208/aggbug/253061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sorry0208/" target="_blank">栗衙</a> 2009-02-03 12:21 <a href="http://www.blogjava.net/sorry0208/archive/2009/02/03/253061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>