黑马程序员技术交流社区

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

作者: 依然超级赛亚人    时间: 2014-7-14 22:57
标题: 抽象类和接口的作用
既然抽象类和接口都不能通过自己创建对象,而且子类又继承了它的所有属性和功能,那为什么不干脆都直接用子类创建子类自己的对象进行使用呢?这样的话,也不用担心父类用不了子类的某些特有功能的问题。
作者: hmid    时间: 2014-7-14 23:19
我的理解是:复用!
继承让一个子类天生就有了父类的非私有属性和方法,它可以像使用自己的属性和方法一样使用继承而来的。另外可定义自己独有的属性和方法。这就让子类少写一些重复代码。
作者: xp8812    时间: 2014-7-14 23:24
本帖最后由 xp8812 于 2014-7-14 23:26 编辑

A extends BC extends B

public void print(B b){

}
用抽象类或者接口当成参数,就可以把任意子类传进去,而不用写成:
public void print(A a){

}



public void print(C c){

}


作者: hejinzhong    时间: 2014-7-15 09:57
我感觉接口就像C语言中的声明函数,就只是为了告诉大家我这里有这些功能,但没说怎么实现,只有需要的时候,才去实现接口并覆写里面的内容。就相当与一个导引,里面只有函数名,方便以后查看代码体系的基本功能。
作者: 南柯一梦    时间: 2014-7-15 13:38
抽象类和接口可以理解为一项规则,可以扩展程序的功能,每个实现类都可能有自己的独特实现方式,若用继承的话会造成垃圾代码太多,让程序更臃肿,且接口可以多现实而继承只能单继承
作者: LFW    时间: 2014-7-15 20:21
我的理解,靠老毕的讲解:猫和狗都要继承动物类,动物都会eat东西,但是eat的具体东西是什么不知道,所以eat方法没有主体(也就是{}),而只是定义了抽象的eat方法,动物类也是抽象的。如果动物类里边没有定义eat方法,猫和狗两个类就不一定都要吃东西了,就违背了规律。反过来,猫和狗都必须要吃东西,吃的东西不具体,所以向上抽取了抽象的eat方法、定义了动物这个抽象类。
作者: zhaoalei    时间: 2014-7-15 21:31
为了增加代码的复用性。
作者: J.twt    时间: 2014-7-15 21:53
路过,看看各位大神的见解
作者: 杨冬冬    时间: 2014-7-15 22:12
类继承体现的是:is a的关系。父类中一般定义的是共性的内容。
接口被实现体现的是:like a的关系。接口中一般定义的扩展功能。
作者: 依然超级赛亚人    时间: 2014-7-15 22:23
hejinzhong 发表于 2014-7-15 09:57
我感觉接口就像C语言中的声明函数,就只是为了告诉大家我这里有这些功能,但没说怎么实现,只有需要的时候 ...

若有所悟,多谢赐教!
作者: 乐此不疲    时间: 2014-7-15 22:25
增强代码的复用性
作者: 叶飞翔    时间: 2014-7-15 22:27
楼上都是大神啊,感觉都好厉害的说。。。
作者: 汉谟拉比    时间: 2014-7-15 22:31
接口和抽象类可以有很多子类,这些子类实现他们自己的功能扩展,另外但学习到后面你就会发现多态的好处
作者: 依然超级赛亚人    时间: 2014-7-15 22:34
杨冬冬 发表于 2014-7-15 22:12
类继承体现的是:is a的关系。父类中一般定义的是共性的内容。
接口被实现体现的是:like a的关系。接口中 ...

恩。接口提供扩展功能这一条倒是能明白大概。就是有一点不明白的是,对于抽象类来说,它的存在使子类继承了他的功能,提高了代码的复用性。既然如此,以后不用抽象类创建对象(借助子类),只用子类创建对象不就行了吗?也就是把抽象类摆在那里,不用借助多态的形式再创建这个抽象类的对象不行吗?
作者: 依然超级赛亚人    时间: 2014-7-15 22:41
LFW 发表于 2014-7-15 20:21
我的理解,靠老毕的讲解:猫和狗都要继承动物类,动物都会eat东西,但是eat的具体东西是什么不知道,所以ea ...

恩...就是不明白为什么会有animal d=new cat();(或 animal d=new dog();)这个步骤,也就是多态。想要使用animal的功能直接创建子类自己的对象不就行了吗?也就是  cat c=new cat();(或 dog d=new dog();)子类继承了它的方法,应该可以实现抽象类想要的功能啊?
作者: 依然超级赛亚人    时间: 2014-7-15 22:43
hmid 发表于 2014-7-14 23:19
我的理解是:复用!
继承让一个子类天生就有了父类的非私有属性和方法,它可以像使用自己的属性和方法一样 ...

恩,复用这个优势倒是能理解,就是不明白为什么在子类能复用父类方法的背景下还要去使用抽象的父类(通过多态创建对象)的方法?
作者: 依然超级赛亚人    时间: 2014-7-15 22:45
xp8812 发表于 2014-7-14 23:24
A extends BC extends B

public void print(B b){

呃...还是有些不明白,万望多赐教一下!
作者: 依然超级赛亚人    时间: 2014-7-15 22:46
J.twt 发表于 2014-7-15 21:53
路过,看看各位大神的见解

不要只路过,发表一下看法嘛?
作者: 依然超级赛亚人    时间: 2014-7-16 09:17
汉谟拉比 发表于 2014-7-15 22:31
接口和抽象类可以有很多子类,这些子类实现他们自己的功能扩展,另外但学习到后面你就会发现多态的好处 ...

恩,一步一步往后学!
作者: LFW    时间: 2014-7-16 11:27
依然超级赛亚人 发表于 2014-7-15 22:41
恩...就是不明白为什么会有animal d=new cat();(或 animal d=new dog();)这个步骤,也就是多态。想要使用 ...

为了调用时能够无差别的接收狗、猫。例如宠物店要写一个卖猫、狗、猪、兔的功能,你不能为猫、狗、猪、兔都写一个卖的功能,也就是为了代码的复用性,你直接写一个卖动物的功能,只要将该功能接收定义为(Animal a ),你就可以接收所有继承了动物类的猫、狗。这也就是为什么要向上转型的原因了。然后你要使用具体是猫抓鱼、狗追猫的特有功能时,因为动物并不都要抓鱼追猫,所以接收进来的Animal a = new Cat(),就要向下转型为Cat c=(Cat)a;这样这个动物就具体为 Cat了,自然就可以抓鱼了。>>>>个人理解。我也刚看完这一段不久,来回看来回看,慢慢体会。
作者: 依然超级赛亚人    时间: 2014-7-16 12:27
LFW 发表于 2014-7-16 11:27
为了调用时能够无差别的接收狗、猫。例如宠物店要写一个卖猫、狗、猪、兔的功能,你不能为猫、狗、猪、兔 ...

恩,这样说明白了不少,这样用应该就是最大限度的提高代码的复用性,将父类的功能“套在”子类身上,使其按照这个规则操作。:handshake
作者: 青偆丶易逝〃    时间: 2014-7-16 12:33
目前,自己学的感觉是, 增加了程序的可扩展性和代码的复用性。。  学java自己应该能感受到他的好处的。。
作者: 崔MQ    时间: 2014-7-16 12:41
功能太多了,多态你懂不懂啊,你还是没有对象的概念啊,比如人分男女,你能说男人是人,女人也是人,但你能说男人是女人么?
作者: 郭良    时间: 2014-7-16 12:52
为了简洁,方便后面使用,两个字,铺垫
作者: 从未有过的晴天    时间: 2014-7-16 14:58
抽象里面有抽象方法,就是让子类必须做某些事情,接口是扩展功能 比如说,你会一门语言就是多了一门技术,但是不会也没关系 你还是你
作者: F@C    时间: 2014-7-16 15:35
进来学习
作者: Beka    时间: 2014-7-16 17:27
这样对象的多态性也用不着了。
作者: LFW    时间: 2014-7-16 17:46
依然超级赛亚人 发表于 2014-7-16 12:27
恩,这样说明白了不少,这样用应该就是最大限度的提高代码的复用性,将父类的功能“套在”子类身上,使其 ...

各人理解都有些出入,慢慢来。觉得视频多看几遍,就能理解了。
作者: 严国泽    时间: 2014-7-16 17:47
增加复用性 吧 。。。
作者: 朱道研    时间: 2014-7-16 17:50
而且对于设计模式,大型项目来说,作用大大的
作者: 人心如水    时间: 2014-7-16 18:28
接口和抽象类,我就只说接口了,接口在开发中重要性无与伦比,他们都是共性内容的不断抽取,比喻说我描述两个手机,一个IP,一个NOKIA,他们都有打电话和发短信,我们就把这两个共同方法抽取建立一个接口,当我们不知道IP这个类的时候,我们只需要知道他的接口,就可以判断这个类是在描述一个个手机,继承会使类显得臃肿,而接口则很简单,你可以看API里面,基本重要点的,写在前面的都是一些接口,知道接口,他的儿子,孙子的大致功能我就差不多知道了。
作者: 依然超级赛亚人    时间: 2014-7-16 22:05
青偆丶易逝〃 发表于 2014-7-16 12:33
目前,自己学的感觉是, 增加了程序的可扩展性和代码的复用性。。  学java自己应该能感受到他的好处的。。 ...

恩,不一样的阶段有不同的理解,随着学习的深入,有些问题会有新的认识!
作者: 依然超级赛亚人    时间: 2014-7-16 22:08
Beka 发表于 2014-7-16 17:27
这样对象的多态性也用不着了。

也许是自己理解的还不够透彻吧,多体会体会就行了。:handshake
作者: 依然超级赛亚人    时间: 2014-7-16 22:11
从未有过的晴天 发表于 2014-7-16 14:58
抽象里面有抽象方法,就是让子类必须做某些事情,接口是扩展功能 比如说,你会一门语言就是多了一门技术, ...

恩,说的有道理,言简意赅的说明了接口的作用!
作者: 依然超级赛亚人    时间: 2014-7-16 22:12
郭良 发表于 2014-7-16 12:52
为了简洁,方便后面使用,两个字,铺垫

恩啊,现在已经明白了许多,多亏各位的积极响应啊。:handshake
作者: M单色调    时间: 2014-7-16 22:12
感觉抽象类和接口差不多了,他们有什么区别呢?新手,刚开始学习!
作者: 依然超级赛亚人    时间: 2014-7-16 22:13
人心如水 发表于 2014-7-16 18:28
接口和抽象类,我就只说接口了,接口在开发中重要性无与伦比,他们都是共性内容的不断抽取,比喻说我描述两 ...

恩,说的专业性很强,很通俗啊,呵呵。
作者: 依然超级赛亚人    时间: 2014-7-16 22:14
朱道研 发表于 2014-7-16 17:50
而且对于设计模式,大型项目来说,作用大大的

恩,越往后就越能体会到它的作用了。
作者: 依然超级赛亚人    时间: 2014-7-16 22:15
严国泽 发表于 2014-7-16 17:47
增加复用性 吧 。。。

恩,最基本的功能体现!
作者: 依然超级赛亚人    时间: 2014-7-16 22:17
崔MQ 发表于 2014-7-16 12:41
功能太多了,多态你懂不懂啊,你还是没有对象的概念啊,比如人分男女,你能说男人是人,女人也是人,但你能 ...

懂一点,但不够透彻,经常想不起来什么时候要用。所以想听听大家的看法。
作者: 杨冬冬    时间: 2014-7-21 22:26
依然超级赛亚人 发表于 2014-7-15 22:34
恩。接口提供扩展功能这一条倒是能明白大概。就是有一点不明白的是,对于抽象类来说,它的存在使子类继承 ...

当然可以,开发当中也很少创建抽象类的对象,他只是偶尔在学习和面试中中使用,让你知道有这个方法
作者: caiyaoren    时间: 2014-7-21 22:39
使代码简洁 提高复用性
作者: rolling-stone    时间: 2014-7-21 23:21
很简单一个代码复用性的问题.也是后面看、马上要讲到多态的原因.




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