黑马程序员技术交流社区

标题: 关于接口与抽象类的区别,视频看了两遍还是搞不懂诶~ [打印本页]

作者: cena约翰塞纳    时间: 2013-9-27 21:00
标题: 关于接口与抽象类的区别,视频看了两遍还是搞不懂诶~
本帖最后由 杨增坤 于 2013-9-29 22:59 编辑

主要是接口和抽象类功能确实有些像
那位给解释下,用简单的语言,打比方举例子都行,让我明白就好,多谢啊多谢!

作者: FFF    时间: 2013-9-27 21:12
Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。
不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
在语法上,抽象类和接口有着以下不同:
1.abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 继承抽象类使用的是extends关键字,实现接口使用的是implements关键字,继承写在前面,实现接口写在后面。如果实现多个接口,中间用逗号分隔。例:
public class Main extends JApplet
public class Main implements Runnable
public class Main extends JApplet implements ActionListener
public class Main extends JApplet implements ActionListener, Runnable
2.在abstract class中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
7.接口中的方法默认都是 public,abstract 类型的。
骚年,你可明白了?
作者: (0.0)’    时间: 2013-9-27 21:26
不要纠结这个问题,你就当接口是个一特殊的抽象类,但是比抽象类用个更广泛,因为你如果继承了抽象类,就不可以继承其他类了,而接口就解决了可以实现多个接口,而实现接口就可以使用即可的一的方法。
等你用的多了自然而然就理解他们的区别了
作者: 酱爆    时间: 2013-9-27 21:36
抽象类就如同人类不但给各种具体的植物取了名字还发明了“植物”这个抽象的词对所有具休的植物进行归类
作者: Jam-l    时间: 2013-9-27 21:44
抽象类是"is a"关系,而接口是"like a"关系。比如说李四是个人,他就应该继承有人的本领 :说话和走路 。而如果他经过了学习当了老师,就实现了老师的本领:教书。说以说 抽象类就是一个类的本质,而接口是扩展性的。
代码演示:

李四:
  1. public class LiSi extends Person implements Teacher {
  2.         @Override
  3.         void walk() {
  4.         }

  5.         @Override
  6.         void speak() {
  7.         }

  8.         @Override
  9.         public void teach() {
  10.         }
  11. }
复制代码
人的抽象类:
  1. abstract class Person {
  2.         abstract void walk();
  3.         abstract void speak();
  4. }
复制代码
老师接口:
  1. public interface Teacher {
  2.         void teach();
  3. }
复制代码

作者: .只影、天涯.    时间: 2013-9-27 22:27
抽象类是提取同类事物中的共性特点,但是它们的实现目的的方式不同。比如从A地使用交通工具到B地,walk、bike、taxi都可以到达目的地,而且它们都是通过陆地到达目的的,而fly(坐飞机)也可以同样能够到达目的地,但不是通过陆地到达目的地的。当然fly也可以作为抽象类的一种,但是它还有它独特的特点:不通过陆地到达目的,相当于扩展了到达目的的方式,因此可以看作成接口。

个人觉得在看视频的学习中确实会碰到一些很细节的东西,实在想不通就先暂时放下,因为学习到后面的知识后,有些想不通的自然的也就迎刃而解了的
作者: 血剑无痕    时间: 2013-9-28 11:01
接口和接口可以是继承的关系,接口也可以说是一个抽象类,抽象类是通过(extends)继承进行实例化,接口是通过(implements)实现来实例化的。接口是用来扩展类的因为java不支持多继承所以通过接口来扩展类。,抽象类在代理中也有应用。我的博客中也有介绍希望对你会有帮助:http://blog.sina.com.cn/s/articlelist_3247264713_0_1.html
作者: 华行天下    时间: 2013-9-28 12:25
接口和抽象类的定义类似、区别就是:
一个类实现接口、必须实现接口里的所有方法、而且一个类可以实现多个接口(相当于多继承)接口使用interface关键字、
而抽象类使用的是abstract 关键字、一个类只能继承一次。继承抽象类的话、是可以不全部实现他的所有方法的。但是你可以重写他的方法;
作者: aion2013tian    时间: 2013-9-28 14:00
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,

另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
作者: cena约翰塞纳    时间: 2013-9-29 21:59
(0.0)’ 发表于 2013-9-27 21:26
不要纠结这个问题,你就当接口是个一特殊的抽象类,但是比抽象类用个更广泛,因为你如果继承了抽象类,就不 ...

恩,谢谢!

作者: cena约翰塞纳    时间: 2013-9-29 22:00
Jam-l 发表于 2013-9-27 21:44
抽象类是"is a"关系,而接口是"like a"关系。比如说李四是个人,他就应该继承有人的本领 :说话和走路 。而 ...

能结合代码表述,太好了,感谢感谢!

作者: cena约翰塞纳    时间: 2013-9-29 22:00
感谢大家的帮助!




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