黑马程序员技术交流社区

标题: 关于抽象类的问题。 [打印本页]

作者: 刘源    时间: 2012-8-1 09:12
标题: 关于抽象类的问题。
本帖最后由 刘源 于 2012-8-1 21:59 编辑

       开始学接口interface的时候还挺明白的,后来又学到abstract class的时候就糊涂了。这2个有什么区别啊,都是抽象的,都不能建立对象。
还有什么时候使用抽象类什么时候使用接口啊,请大家回答下。谢谢!



问题已经解决”。

作者: 黑马-唐磊    时间: 2012-8-1 09:26
本帖最后由 黑马-唐磊 于 2012-8-1 09:33 编辑

抽象类和接口的区别:抽象类的成员可以具有访问级别,而接口的成员全部public级别,抽象类可以包含字段,而接口不可以,抽象类可以继承接口,而接口不能继承抽象类。抽象类的成员可以具有具体实现,而接口不行,抽象的子类可以选择性实现其基类的抽象方法,而接口的子类必须实现。什么时候用到抽象类,我举个简单例子来说明,比如狼和狗都是犬科,他们都有吼叫的方法,但具体不知道是怎么吼叫的,所以这个功能就定义为抽象,具体的吼叫由具体的子类完成,也就是当有一个不具体的方法时就需要定义为抽象,其实就是对内容的不断向上抽取。定义了对事物的描述,但是描述的不够具体。什么时候用到接口,就是有大部分方法相同,为了简化代码就要用到接口
作者: 许庭洲    时间: 2012-8-1 09:27
1,抽象类用于部分实现一个类,再由用户按需求对其进行不同的扩展和完善;接口只是定义一个行为的规范或规定;
2,抽象类在组件的所有实现间提供通用的已实现功能;接口创建在大范围全异对象间使用的功能;
3,抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能;
4,抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块;
5,抽象类是一个不完全的类,需要进一步专业化.接口只是一个行为的规范或规定;
6,接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
7,一个类一次可以实现若干个接口,但是只能扩展一个父类;
8,接口可以用于支持回调,而继承并不具备这个特点。
作者: 陈冲    时间: 2012-8-1 09:33
抽象类方法是只声明而未实现的方法, 所有的抽象方法必须使用abstract关键字生命,包含抽象方法的类也必须使用abstract class生命。
    1.抽象类和抽象方法都必须使用abstract关键字来修饰;
    2.抽象方法不能被直接实例化,也就是不能直接用new关键字去产生对象;
    3.抽象方法只需要声明,而不需要事先;
    4.含有抽象方法的类必须生命为凑响雷,抽象类的子类必须覆写所有的抽象方法后才能被实例化,否则这个类还是抽象类。
定义格式:
  1. abstract class 类名称                    //定义抽象类
  2. {
  3.     声明数据成员;

  4.     访问权限 返回值的数据类型 方法名称(参数...)
  5.     {
  6.         定义一般方法;
  7.     }
  8.     abstract 返回值的数据类型 方法名称(参数...);        //定义抽象方法,在抽象方法里没有定义方法体
  9. }
复制代码
而接口与抽象类有两点不同:
    1.接口里的数据成员必须初始化,而且数据成员都为常量;
    2.接口里的方法必须声明为abstract,也就是说,接口不能像抽象类一样保有一般的方法,必须全部是 抽象方法。
定义格式:
  1. interface 接口名称                    //定义接口
  2. {
  3.     final 数据类型 成员名称 = 常量 ;    //数据成员必须赋初值
  4.     abstract 返回值的数据类型 方法名称(参数...);        //抽象方法, 注意:在抽象类中没有定义方法主体
  5. }
复制代码
注意:抽象方法声明的关键字abstract是可以省略的,声明数据成员的关键字final也可以省略;
           但是会默认为
           1.全局常量 public static final
           2.抽象方法 public abstract


以前也有人问过这个问题,我就直接把我以前的回答复制过来了~

作者: 周坤    时间: 2012-8-1 09:35
抽象类里面可以有非抽象方法
但接口里只能有抽象方法
抽象类可以继承接口,而接口不能继承抽象类
抽象类的成员可以具有具体实现,而接口不行
抽象的子类可以选择性实现其基类的抽象方法,而接口的子类必须实现,abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系
abstract class在Java语言中体现了一种继承关系,要想使得 继承关系合理,父类和派生类之间必须存在"is-a"关系,即父类和派生类在概念本质上应该是相同的。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的, 仅仅是实现了interface定义的契约而已。表示的是"like-a"关系。
在Java中引进接口主要是为了解决多继承的问题。
作者: 黄锐    时间: 2012-8-1 10:39
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,

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

还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.
作者: 孙建飞    时间: 2012-8-1 11:44
本帖最后由 孙建飞 于 2012-8-1 11:46 编辑

1抽象类 表示的是一种继承关系,一个类只能使用一次继承关系(一个类只能继承一个抽象类)。然而,一个类却可以实现多个接口。

2.在抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法,而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,但是在接口中一般不定义数据成员,所有的成员方法都是abstract的。

3.抽象类和接口所反映出的设计理念不同。抽象类表示的是"is-a"关系,接口表示的是"like-a"关系。

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public,abstract 类型的。


作者: 王峰    时间: 2012-8-1 11:46
抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: 杨康    时间: 2012-8-1 14:11
1.当一个类中只要有抽象方法,这个类就必须是抽象类.
2.当一个类中,既有抽象方法,又有非抽象方法,那么这个类参考第一条,也必须是抽象类.
由于抽象类中有抽象方法,所以不能直接创建对象.对于实现了该类的其他类,想要创建对象,就必须复写抽象类,使其变为非抽象类.
也就是说抽象类中必须有抽象方法,也可以有非抽象方法.

对于接口,接口中的方法必须全部都是抽象的,不能含有非抽象方法,否则就是抽象类.
接口中都是抽象方法,所以也不能直接创建对象,必须由其他类实现该类并且全部复写其抽象类才能创建对象.

至于什么时候使用接口,什么时候使用抽象类,就要看你具体要求,如果你创建的对象使用到一个接口中的全部方法,覆盖其全部抽象方法,就使用接口.
如果需要实现部分方法,就可以使用某些抽象类中的抽象方法将其实现即可.

接口的出现是java为了避免单继承的局限性,提高功能扩展性而出现的.
作者: 刘源    时间: 2012-8-1 20:51
问题已经解决




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