黑马程序员技术交流社区

标题: 抽象类和接口 [打印本页]

作者: 张文兵    时间: 2012-6-10 02:09
标题: 抽象类和接口
对于抽象类和接口还是有点不明白,接口到底有什么作用啊?书上说的是:接口的设计目的是为了让类不必受限与单一继承的关系,而可以灵活的同时继承一些公有的特性,从而达到多重继承的目的。我有点不明白,实现一个接口必须要实现里面所有的方法,但是我也可以不去实现这个接口,自己在类中直接实现相应的方法,这样做和implements一个接口有什么不一样啊?接口到底有什么作用啊?
作者: 江南    时间: 2012-6-10 02:34
继承就是把共性内容不断向上抽取而来的,例如你老爸有100万,这时候你要用你就不用去挣100万了直接从老爸那里继承过来! 而接口呢就类似你老爸这里有个挣钱的方法,而你又比较独立然后自己根据老爸给你的挣钱方法去挣这100万
按照我的理解可能会给你增加更多的困惑,这是毕向东老师的总结的文档,希望你看了会更了解
面向对象的第二特征:
继承:
        好处:
        1,提高了代码的复用性。
        2,让类与类之间产生了关系。有了这个关系才有了多态的出现。

java只支持单继承,不支持多继承(其实java保留了多继承机制,
但是多继承容易出现问题,用另一种方式来体现--多实现)。

java支持多层继承。
其实就是一个继承体系。
继承体系何来?其实都是通过对事物的分析,将共性内容不断向上抽取而来的。

想要对一个继承体系的功能进行使用时,可以参考一个技巧。
查阅顶层父类中的方法。因为这里的方法都是共性方法。
建立该体系中最子类的对象。
如果需要使用子类特有方法时,才需要查看子类的方法。


什么时候定义继承呢?

当类与类之间存在所属(is a)关系时,就可以定义继承。
如何判断所属关系呢?一个类是否可以获取到另一个类中所有的内容,如果可以,那么可以继承。

class DemoA
{
        void showA(){}
        void showB(){}
        void showC(){}
}


//DemoB中也有一个showC()方法。那么DemoA中已经定义好了,可不可以直接继承过来用呢?
//很遗憾,showA(),showB(),并不是适合DemoB,也就是DemoB中不可以有showA(),showB()
class DemoB
{
        void showC(){}
        void showD(){}
}


//虽然DemoB不可以继承DemoA,但是发现他们有共性方法。那么可以继续向上抽取。
class Demo
{
        void showC(){}
}

class DemoA extends Demo
{
        void showA(){}
        void showB(){}
}
class DemoB extends Demo
{
        void showD(){}
}
接口:
        特点:
        1,接口用于功能的扩展。
        2,接口其实就是对外暴露的规则。
        3,接口的出现降低了藕合性。
        比如:笔记本usb接口,主板的pci接口。mp3,手机,插排。

        好处:
        接口的出现,保留了多继承的机制,用多实现来表示。
        而且接口可以多继承接口。
        一个类在继承一个类的同时,可以实现多个接口。

        代码规则:
        使用interface关键字定义的。编译后生成的是.class文件。
        接口中通常的成员:常量。抽象方法。
        而且这些成员的有固定的修饰符。
        常量:public static final。
        方法:public abstract
        interface Demo
        {
                int x= 3;
                void show();.//不些这些固定修饰符,系统会自动加上。
        }
        但是要注意,复写接口中的方法的时候,一定要加上public。

        类与接口之间是实现关系implements。
        一个类必须实现接口中所有的方法后,才可以被实例化,否则该类还是一个抽象类。


----------------------------------------

        抽象类和接口的不同。
        学员示例。

        abstract class XueYuan
        {
                public void sleep()
                {}

                public abstract  void study();
               
        }

        interface Play
        {
                void play();
        }

        class Zhangsan extends XuYuan implements Play
        {
                public void study(){}
                public void play(){}               
        }

        问题领域。在分析事物时,值考虑该事物领域内的内容。
        那么对于打球方法,并不是该领域的基本方法。这时把该功能扩展出去。通过接口来完成。



        球员示例。
        abstract class QiuYuan
        {
                abstract void play();

        }
        interface Study
        {
                void study();
        }

        class Wangwu extends QiuYuan implements Study
        {
                void play(){}
                void study(){}
        }
接口的应用:
        编写一个项目,该项目应用到了数据库(mysql)
        到了后期,软件有了新的需求,使用Oracle数据库。
               
        对数据库的操作常见的四种操作,增 删 改 查。
        class SqlOperate
        {
                public void add()
                {
                        mysql code;
                }
                public void del()
                {
                        mysql code;
                }
        }

        换成oracle就需要该动SqlOperate该类中的方法内容。
        后期维护不建议该动代码,灾难。

        在前期分析的时候,就应该考虑到这样需求。
        为了后期扩展方便,留有扩展余地,进行功能的扩展。

        interface SqlDao
        {
                public void add();
                public void del();
        }
        class MySqlOperate implements SqlDao
        {
                public void add()
                {
                        mysql code;
                }
                public void del()
                {
                        mysql code;
                }
        }
        到了后期变成oracle时,
        只需要在定义一个类去重新实现接口即可。
        class OracleSqlOperate implements SqlDao
        {
                public void add()
                {
                        Oracle code;
                }
                public void del()
                {
                        Oracle code;
                }

作者: 杨天皓    时间: 2012-6-10 02:47
这是因为在JAVA中只允许单继承,也就是说,一个类只能继承自一个父类。这样虽然有安全上的考虑,可是问题出来了,现实世界中有很多东西并不是用简单的单继承就可以解决的,比如,我们继承了父亲的基因,但是也继承了母亲的基因。如果在JAVA中只有抽象类,这种情况是无法解决的。所以JAVA提出了这个接口的概念。简单举个例子:所谓接口,相当于电源插座,可插入构件相当于电器。可插入构件的关键在于存在一个公用的接口,以及每个构件都实现了这个接口。如果没有这个接口,那岂不是每一个电器都要自备一个接口才能使用了?

作者: 黄捷    时间: 2012-6-10 08:29
Java封装性比较高,用接口实现多继承第一个是安全方面的考虑,另一个是帮你把减少代码量。早就封装好的类为什么不直接用呢?非要自己去定义。Java最大的好处就是高集成性,高封装性
作者: 何志文    时间: 2012-6-10 08:54
抽象类是能有具体的方法,接口全是抽象的。。
先说接口好处。
好比USB接口。电脑的USB接口什么能键盘和鼠标等。。看下面
USB  i=new 键盘();
USB  i=new 鼠标();
抽象的好处。。。。
是为了代码的复用
只能说这么多。。我也是新手。。

是不是方便多了。不能键盘去打键盘的,鼠标去找鼠标的。


作者: 郑文博    时间: 2012-6-10 09:43
抽象类和接口异同:
相同:
1,都可以在内部定义抽象方法。
2,通常都在顶层。
3,都不可以实例化,都需要子类来实现。

不同点:
1,抽象类中可以定义抽象方法和非抽象方法,
        而接口中只能定义抽象方法。
2,接口的出现可以多实现。
        抽象类只能单继承。
        也就是说:接口的出现避免了单继承的局限性。
3,继承和实现的关系不一致。继承:is a,实现:like a
综上所述:
如果你想定义的方法全部都是抽象方法那么用接口,否则用抽象类.
而且接口可以多实现,对类的单继承进行了改良.
作者: 朝哥    时间: 2012-6-10 10:34
用接口的最大原因是
开发这个语言的sun公司就是这么定义的,你不实现就会报错。而且
接口给子类提供必须实现的方法,主要是起规范作用。

打个比方,一个国家应该不需要宪法吧,自己本地创建自己的法律不就完事了?
为什么非要有宪法了,因为宪法就是一种规范,你们地方创建自己的法律必须以宪法为基准。否则就乱套了。


作者: 徐炯    时间: 2012-6-10 10:43
楼上的回答都很好,我来补充点.

java是面向对象的编程语言,它设计接口和抽象类的目的就是为了更安全更有效的描述对象。
我们在设计开发的时候,有个原则,把变化的部分和不变化的部分区分开来(策略模式常用),
变化的部分一般用接口(相对较多),不变的部分用抽象类,这样做的好处是,
子类对象可以任意复写父类(抽象类)方法,而不用担心父类中的方法发生变化,
在设计抽象类的时候也不用考虑以后代码的更改,若要更改代码则只需增删接口代码即可,因为java支持多实现。
作者: 武剑峰    时间: 2012-6-10 10:55
接口其实是个规定,如果一个类实现了接口,别人就知道肯定有其方法,方便他人和自己调用,你自己写方法的话,除非看了代码否则无法得知,其实这是更方便team 编程
来自:黑马程序员训练营论坛 Android客户端




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2