A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王永杰 中级黑马   /  2012-9-5 05:53  /  1854 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王永杰 于 2012-9-30 11:29 编辑

一、从语法定义层面看  在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。二、从编程层面看  abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。三、从设计理念层面看  abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。 对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约(功能)而已。
* 上面内容来源于百度百科)

可我最疑惑的是有太多的时候还是犹豫不决的选错二者,有没有朋友跟我一样在最初的建立的时候,往往不明确到底用哪个最为妥协,结果最后才发现需要改成什么什么的,可现在我疑惑不解的是调用了太多的错误后需要修改,可二者的最大的差异下如何来回转换。或者如何间二者更好的结合使用,在错的时候自由的选择来调节程序的性能。

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
接口用于定义一个规则,实现接口的类必须覆写接口中所有的方法,比如接口定义了车的概念,接口声明了作为车应该有的属性和方法,是一个规范!吉普车作为车的一种,实现了接口那么就必须实现接口中定义的方法,因为那是所有车的属性和方法,实现类可以对接口进行拓展,增加自己的特性和方法!
回复 使用道具 举报
首先你要明白,抽象类与接口的区别,各有什么好处,类只能继承,继承强调,我有,我这个类系就必须得有.而接口强调扩展,意思你想要有,你就实现,抽象类可以没有抽象方法,这就使行其可以选择性的重写实现interface的方法,而且其是一个类,只能单继承,继承就表有子类都具有,里面的属性和方法没有那么严格的修饰,所以比较灵活.而接口则可以实现多继承,没有限制,但里面属性比较严格,只能是常量,你知道这个就比较容易了,为什么接口会比较严格?因为其定义了一种规则,么,只要想做某方面的扩展,就必须按这个规则办,其可以对一类的问题起作用,适应范围广.抽象类则比较宽松,那么其可供我们支配的内容更多,但又同具备抽象的优点.  打个比方,定义一个车,其下有宝马,有奔驰,车都有车名,车都是打火后运行,但打火方式不一样,定义成一个普通类也不合适.且所有的车都有这功能,不能说有的车不要运行,有的车要运行,这个车定义成一个接口就不合适了,类为就应该这么定义为一个抽象类,假如有一个功能,比如放电影,这就不是所有的车都必备的,且放电影具体实现方式,不一样,有的有的通过物理按健,有的通过屏幕触摸.这个时候就该定义一个接口.

abstract class  Car
{
        String name;       
    abstract void dianHuo();
        void run()
        (
                dianHuo();
        )
}
interface Movie
{
        public abstract void play();
}
class BMW extends Car
{
        String name="宝马";
        abstract void dianHuo()
        {
                System.out.println("宝马点火");
        }

}
class Benz extends Car implements Movie
{
        String name="宝马";
        abstract void dianHuo()
        {
                System.out.println("奔驰点火");
        }
        public void play()
        {
                System.out.println("奔驰放电影");
        }
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
写代码多了就可以很好的把握,如果一个类A和另外一个B类具有a is b的关系,那么A就可以从B继承。接口可以说是抽象行为。举例说明吧。警察、小偷、记者,他们都要吃饭、睡觉,他们都有年龄、身高这些属性,他们每个人的身高、年龄都不一样,他们吃的东西、睡觉的方式也不一样,显然这种情况用接口进行规范不太适合,让他们都从人这个抽象类继承比较适合,规定一些他们的一些相同的行为,像吃饭睡觉,至于怎么吃怎么睡,只有他们自己知道,所以这些个方法都是抽象的。他们由于身份不一样,所以就有不同的行为,像警察有个行为时抓小偷,小偷有个行为是警察抓他时他逃跑,记者有得行为就是采访警察抓小偷这件事,所以抽象具体行为使用接口合适,警察实现一个可以抓小偷的接口,小偷实现一个可以逃跑的接口,记者实现一个可以采访的接口。使用继承还是接口,最主要的看他们是否有特定的行为,有得话使用接口,还有一个原则一般在写程序中能使用接口就不使用继承,因为正如楼主说的人那样,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,另外使用继承会增加类与类的耦合度,不利于代码的维护。多写点代码就是对面向对象了解越来越深了,就像练武功一样,任督二脉打通了,其他的都自然会了。楼主加油啊,希望对你有所帮助。。。。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
佟亚鹏 发表于 2012-9-5 11:08
写代码多了就可以很好的把握,如果一个类A和另外一个B类具有a is b的关系,那么A就可以从B继承。接口可以说 ...

谢谢 大家的真诚回复,我感觉你们说的都非常好。可我还是的认真的多写代码啊。或许只有这样会熟练吧。希望大家也都能早日弄懂。
回复 使用道具 举报
本帖最后由 佟亚鹏 于 2012-9-5 13:47 编辑

多写点代码好处多多,以后就能体会到代码量的能量了,是一种积累的过程
回复 使用道具 举报
王永杰 发表于 2012-9-5 12:59
谢谢 大家的真诚回复,我感觉你们说的都非常好。可我还是的认真的多写代码啊。或许只有这样会熟练吧。希 ...


那就加油吧  大家一起进步哦,能采纳吗   认真的回答了一上午的帖子   一分也没得  唉。。。。。。
回复 使用道具 举报
王永杰 发表于 2012-9-5 12:59
谢谢 大家的真诚回复,我感觉你们说的都非常好。可我还是的认真的多写代码啊。或许只有这样会熟练吧。希 ...


那就加油吧  大家一起进步哦,能采纳吗   认真的回答了一上午的帖子   一分也没得  唉。。。。。。
回复 使用道具 举报
佟亚鹏 发表于 2012-9-5 13:18
那就加油吧  大家一起进步哦,能采纳吗   认真的回答了一上午的帖子   一分也没得  唉。。。。。。 ...

呵呵 努力吧! 别灰心一切问题的解决足已证明你的能力。希望你能帮助到更多的人。谢谢啦!
回复 使用道具 举报
这个就是面向对象的设计理念了,怎样做到低耦合,高可扩展性,高可维护性等等了.
这样的问题,不是可以用文字来做具体回答的了.这要根据实际项目的具体需要来进行类的设计,接口的定义,以及数据库的建表了.
你这种问题,需要举例说明.你要想真正吃透,必须要多思考,多练习,就从"低耦合,高可扩展性,高可维护性"这三个方面去思考和练习,这不是一朝一夕可以做到的.
回复 使用道具 举报
这个 你现在弄懂了吗?我有点稍微的迷惑
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马