黑马程序员技术交流社区

标题: 抽象类与接口 [打印本页]

作者: 明锦添    时间: 2013-3-18 22:42
标题: 抽象类与接口
抽象类与接口如何理解
作者: 飞天小猪猪    时间: 2013-3-18 22:49
初期理解,接口就是特殊的抽象类。 当抽象类中的所有方法都是抽象方法时,那么这个类就可以通过接口的形式来表示,用接口来称呼这个类。
抽象类中的方法不一定全是抽象方法,而接口中的必定全是抽象方法。
作者: 我自信我很牛    时间: 2013-3-18 22:50
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
作者: 罗威    时间: 2013-3-18 23:01
要理解抽象类和接口,必须要先理解继承的特性!
抽象类:通过将子类的共性方法不段向上抽取而来,只要有一个类中有一个方法是抽象的,那么他必定是一个抽象类!
接口:当一个抽象类里面的所有方法都是抽象的时候就可以定义成一个接口!

下面是他们的区别,希望对你理解为什么要用接口提供很好的帮助!

A:成员区别
                        抽象类:
                                构造方法 用于给子类实例化使用。
                                成员变量 既可以是常量,也可以是变量。
                                成员方法 既可以是抽象的,也可以是非抽象的。
                        接口:
                                成员变量 只能是常量。
                                         默认修饰符 public static final
                                成员方法 只能是抽象方法
                                         默认修饰符 public abstract
                B:继承和实现的区别
                        类与类的关系(继承关系):
                                单继承,可以多重继承。

                        类与接口的关系(实现关系):
                                可以单实现,也可以多实现。
                                还可以在继承一个类的同时,实现多个接口。(这一点是接口最重要的一个特点,弥补了JAVA只能单继承的缺陷)

                        接口与接口的关系(继承关系):
                                可以单继承,也可以多继承。
作者: 郭利超    时间: 2013-3-18 23:01
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
  抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象。
  比如:我们要描述“水果”,它就是一个抽象,它有质量、体积等一些共性(水果有质量),但又缺乏特性(苹果、橘子都是水果,它们有自己的特性),我们拿不出唯一一种能代表水果的东西(因为苹果、橘子都不能代表水果),可用抽象类来描述它,所以抽象类是不能够实例化的。当我们用某个类来具体描述“苹果”时,这个类就可以继承描述“水果”的抽象类,我们都知道“苹果”是一种“水果”。
  在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为这个抽象类的所有派生类。

接口和抽象类中的所有抽象方法不能有具体实现,而应在它们的子类中实现所有的抽象方法(要有函数体,哪怕{ }里是空的),java的设计者可能为抽象方法的灵活性考虑,每个子类可根据自己的需要来实现抽象方法。



抽象类(abstract class)的定义方式如下:
public abstract class AbstractClass             //里面至少有一个抽象方法
{
  public int t;  //普通数据成员
   public abstract void method1();   //抽象方法,抽象类的子类在类中必须实现抽象类中的抽象方法
  public abstract void method2();
  public void method3();   //非抽象方法
  public int method4();
  publi int method4 (){
        …… //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
  }

       public void method3(){
        …… //抽象类中可以赋予非抽象方法方法的默认行为,即方法的具体实现
  }  

}



接口(interface)的定义方式如下:
public interface Interface
{
  static final int i;  //接口中不能有普通数据成员,只能够有静态的不能被修改的数据成员,static表示全局,final表示不可修改,可以不用static final 修饰,会隐式的声明为static和final
  

   public void method1();  //接口中的方法一定是抽象方法,所以不用abstract修饰
  

  public void method2();  //接口中不能赋予方法的默认行为,即不能有方法的具体实现
}

  

  简言之抽象类是一种功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数据的集合,两者都不能被实例化。
  从某种意义上说,接口是一种特殊形式的抽象类,在java语言中抽象类表示的是一种继承关系,一个类只能继承继承一个抽象类,而一个类却可以实现多个接口。在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。



  








进一步理解,关于java引入抽象类、接口的目的,向高手请教得到的答复如下:



1、从类的层次结构上看,抽象类是在层次的顶端,但在实际的设计当中,一般来说抽象类应当是后面才会出现。为什么?实际上抽象类的获取有点像数学中的提取公因式:ax+bx,x就是抽象类,如果你没有前面的式子,你怎么知道x是不是公因式呢?在这点上,也符合人们认识世界的过程,先具体后抽象。因此在设计过程中如果你得到大量的具体概念并从当中找到其共性时,这个共性的集合就是抽象类应当是没错的。
2、interface从表面上看,和抽象类很相似,但用法完全不同。它的基本功能就是把一些毫不相关的类(概念)集合在一起形成一个新的、可集中操作的“新类”。我给学生的一个典型例子就是“司机”。谁可以当司机?谁都可以,只要领取了驾照。所以我不管你是学生,白领、蓝领还是老板,只要有驾照就是司机。
interface DriverLicence {
Licence getLicence();
}

class StudentDriver extends Student implements DriverLicence {
}
class WhtieCollarEmployeeDriver extends WhtieCollarEmployee implements DriverLicence {
}
class BlueCollarEmployeeDriver extends BlueCollarEmployee implements DriverLicence {
}
class BossDriver extends Boss implements Driver {
}

当我定义了“汽车”类后,我就可以指定“司机”了。

class Car {
setDriver(DriverLicence driver);
}
这时候,Car的对象并不关心这个司机到底是干什么的,他们的唯一共同点是领取了驾照(都实现了DriverLicence接口)。这个,应当是接口最强大的地方也是抽象类无法比拟的。
      总结:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。通常我们平时养成良好的习惯就是多用接口,毕竟java是单继承,不像C++,但是在需要使用抽象类的时候一定还是要用的(有点类似goto的用法),呵呵
作者: 123    时间: 2013-3-18 23:05
接口是更加彻底的抽象,接口里面的方法全部是抽象方法,而抽象类里面有非抽象的方法。
接口和抽象类都不能被实例化,都位于继承树的顶端,用于被其他类实现和继承。
接口体现的是一种规范,而抽象类体现的是一种模板设计模式
作者: IT菜鸟    时间: 2013-3-18 23:22
抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类。抽象类有点类似“模板”的作用,目的是根据其格式来创建和修改新的类。对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract。 在抽象类中的成员方法可以包括一般方法和抽象方法。抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract。 抽象类中不一定包含抽象方法,但是包含抽象方法的类一定要被声明为抽象类。抽象类本身不具备实际的功能,只能用于派生其子类。抽象类中可以包含构造方法,但是构造方法不能被声明为抽象。

接口可以理解为是一种特殊的抽象类,它里面的所有方法都是抽象的。java 是单继承机制,但一个类却可以实现多个接口。接口的注意特点如下:
1, Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显示初始化,即接口中的成员变量为常量(大写,单词之间用"_"分隔)
2, Java接口中的方法默认都是public,abstract类型的(都可省略),没有方法体,不能被实例化
3, Java接口中只能包含public,static,final类型的成员变量和public,abstract类型的成员方法
4, 接口中没有构造方法,不能被实例化
5, 一个接口不能实现(implements)另一个接口,但它可以继承多个其它的接口
6, Java接口必须通过类来实现它的抽象方法
7, 当类实现了某个Java接口时,它必须实现接口中的所有抽象方法,否则这个类必须声明为抽象的
8, 不允许创建接口的实例(实例化),但允许定义接口类型的引用变量,该引用变量引用实现了这个接口的类的实例
9, 一个类只能继承一个直接的父类,但可以实现多个接口,间接的实现了多继承.


作者: HM赵磊    时间: 2013-3-18 23:51
一、抽象类(abstract class)
抽象类中的方法可以是抽象的也可以是非抽象的(包含两个特殊的情况,全部是抽象方法和全部是非抽象方法)。对于抽象类中的方法全部是非抽象的情况,这是为了传宗接代-----强制让其子类继承
二、接口 (interface)
接口中的方法必须全部是抽象的,并且有默认的public abstract修饰,所以要注意一点,当子类实现接口的时复写接口中的方法要注意权限的问题;接口里面的成员变量有默认的public static final 修饰,所以要注意,这些成员变量只允许读,不允许写
三、二者用法上的不同
对于java只支持单继承,为了解决这个问题java提供了多实现机制。二者用法的不同,抽象类被继承复写方法是正常的按部就班的使用,而接口是为了补充添加的作用。例如在集合框架中,TreeSet这个容器要想存储不重复的学生对象(学生对象是从人继承而来的),那么需要怎么做呢?由于学生继承人,学生没有比较的特性,但是java提供了一个接口Comparable,此接口强行对实现它的每个类的对象进行整体排序,那么只需要让学生类实现Comparable接口即可使其具有比较性(这时Comparable接口就是补充学生类的特性----使其有比较性)
另:若二者中的抽象方法不全被子类对象复写实现,那么得到的子类是抽象类。







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