黑马程序员技术交流社区

标题: 抽象类和接口有什么区别? [打印本页]

作者: 刘宇祥    时间: 2014-3-9 16:11
标题: 抽象类和接口有什么区别?
抽象类和接口有什么区别?   PS:最好详细一点。
作者: 等风来_________    时间: 2014-3-9 16:37
  抽象:不具体,看不明白。抽象类表象体现。
  在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。
  抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。
  
抽象类的特点:
   1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
   2:抽象方法只定义方法声明,并不定义方法实现。
   3:抽象类不可以被创建对象(实例化)。
   4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
  
抽象类的细节:
1:抽象类中是否有构造函数?有,用于给子类对象进行初始化。
2:抽象类中是否可以定义非抽象方法?
        可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分。
3:抽象关键字abstract和哪些不可以共存?final ,        private , static
4:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。
--------------------------------------------------------------------------------------------

接 口:
1:是用关键字interface定义的。
2:接口中包含的成员,最常见的有全局常量、抽象方法。
  注意:接口中的成员都有固定的修饰符。
        成员变量:public static final
        成员方法:public abstract
interface Inter{
        public static final int x = 3;
        public abstract void show();
}
3:接口中有抽象方法,说明接口不可以实例化。接口的子类必须实现了接口中所有的抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。
4:类与类之间存在着继承关系,类与接口中间存在的是实现关系。
        继承用extends  ;实现用implements ;
5:接口和类不一样的地方,就是,接口可以被多实现,这就是多继承改良后的结果。java将多继承机制通过多现实来体现。
6:一个类在继承另一个类的同时,还可以实现多个接口。所以接口的出现避免了单继承的局限性。还可以将类进行功能的扩展。
7:其实java中是有多继承的。接口与接口之间存在着继承关系,接口可以多继承接口。

接口都用于设计上,设计上的特点:(可以理解主板上提供的接口)
1:接口是对外提供的规则。
2:接口是功能的扩展。
3:接口的出现降低了耦合性。

抽象类与接口:
抽象类:一般用于描述一个体系单元,将一组共性内容进行抽取,特点:可以在类中定义抽象内容让子类实现,可以定义非抽象内容让子类直接使用。它里面定义的都是一些体系中的基本内容。
接口:一般用于定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能。

抽象类和接口的共性:都是不断向上抽取的结果。

抽象类和接口的区别:
1:抽象类只能被继承,而且只能单继承。
    接口需要被实现,而且可以多实现。
2:抽象类中可以定义非抽象方法,子类可以直接继承使用。
   接口中都有抽象方法,需要子类去实现。
3:抽象类使用的是  is a 关系。
   接口使用的 like a 关系。
4:抽象类的成员修饰符可以自定义。
   接口中的成员修饰符是固定的。全都是public的。

  在开发之前,先定义规则,A和B分别开发,A负责实现这个规则,B负责使用这个规则。至于A是如何对规则具体实现的,B是不需要知道的。这样这个接口的出现就降低了A和B直接耦合性。

作者: 梦里花-静    时间: 2014-3-9 16:46
1、使用的修饰符不同抽象类使用abstract关键字;接口使用interface关键字。
2、抽象类中的方法也要被abstract修饰,抽象类是多个类出现相同功能,但功能的内容不同,而向上抽取功能定义,不抽取功能主体而来;接口初期的理解可以认为是特殊的抽象类
语法上的区别:
1,抽象类里可以有构造方法,而接口内不能有构造方法。
2,抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
3,抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
4,抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5,抽象类中可以包含静态方法,接口内不能包含静态方法。
6,抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public  static类型,并且默认为public static类型。
7,一个类可以实现多个接口,但只能继承一个抽象类。
说的不是很详尽,你可以仔细看看毕向东老师的基础视频中的第7天课程的8-15小节内容。
作者: 赵文超    时间: 2014-3-10 16:09
1、抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

2、接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口
作者: 欧阳疯    时间: 2014-3-10 17:22
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
另外,接口和抽象类在方法上有区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3.抽象类中可以有普通成员变量,接口中没有普通成员变量
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
二者在应用方面也有一定的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码。
作者: victorsun    时间: 2014-3-10 19:03
简单具体来说,有以下3个区别
1、首先,抽象类中可以有非抽象方法,但是在类中所有的方法都是抽象的,即抽象类中的方法都可以被实现,但是接口中的抽象方法无法被实现。
2、其次实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法。
3、最后接口可以实现多重继承,而一个类亦或抽象类只能继承一个超类。

作者: chaos    时间: 2014-3-10 20:58
抽象类:
  用abstract关键字来修饰一个类时,这个类叫做抽象类。用abstract来修饰一个方法时,这个方法叫抽象方法
  含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写
  抽象类不能被实例化
  抽象方法只需声明不需要实现
接口:
  接口是抽象方法和常量值的定义的集合
  从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
  多个无关的类可以实现同一个接口
  一个类可以实现多个无关的接口
  与继承关系类似,接口与实现类之间存在多态性
  接口中只能定义抽象方法,这些方法默认为public
  接口可以继承其他接口,并添加新的属性和抽象方法
接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
接口可以多继承,抽象类不行
接口定义方法,不能实现,而抽象类可以实现部分方法。
作者: 戒爱    时间: 2014-3-10 22:02
接口就是规则条款让别人就照着那样干
抽象类就是一个不具备劳力的老人
作者: 为你而去    时间: 2014-3-10 23:17
最基本的区别是接口中只能定义抽象函数,抽象类中可以有不是抽象的函数
作者: pifuhanshu    时间: 2014-3-11 16:49
    1.抽象类可有抽象方法,也可有非抽象方法。对于抽象方法,只允许声明不允许实现。而且不允许使用final、abstract同时修饰同一个方法。
    接口体中只有方法的声明,不提供方法的具体实现,所以方法的定义没有方法体。
    2.对于抽象类,不能使用new运算符创建该类的对象。如果非抽象类是抽象类的子类,它必须重写父类抽象方法,给出方法体,但必须保证声明的方法名字、返回类型、参数个数和类型与父类的抽象方法完全相同。
      如果一个类实现某个接口,那么这个类 必须实现接口的所有方法。方法的名字、返回类型、参数个数及类型必须与接口中的完全一致。   如果父类实现某个接口,那么子类也就必然实现了该接口,子类不必再显示的使用关键字implements声明自己实现这个接口。
      3.抽象类声明的对象成为其子类对象的向上转型对象,并调用子类重写的方法。
        接口的类创建对象的对象的引用赋给该接口声明的接口变量时,可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口中的方法。
         
  




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