抽象类和接口

来源:互联网 发布:淘宝网上开网店流程 编辑:程序博客网 时间:2024/05/18 02:39

抽象类和接口

抽象类和接口是是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。抽象类和接口之间对于抽象类定义的方面具有很大的相似性,甚至可以相互替换。 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行分析。

一、抽象类

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
实例:定义一个抽象类Animal,提供抽象方法shout(),Dog()和Cat()都继承了抽象类Animal,所以必须实现其重写方法。

public class Demo01 {    public static void main(String[] args) {        Animal cat=new Cat();        Animal dog=new Dog();        cat.shout();//猫叫:喵喵~~~~        dog.shout();//狗叫:汪汪~~~~    }}// 抽象类abstract class Animal {    public abstract void shout(); // 抽象方法}class Cat extends Animal {    @Override    public void shout() {        System.out.println("猫叫:喵喵~~~~");    }}class Dog extends Animal {    @Override    public void shout() {        System.out.println("狗叫:汪汪~~~~");    }}
说明:定义了动物类Animal,这个对于我们来说并不知道具体的是什么动物,所以将其定义成了抽象类。需要子类继承该类,重写该类中所有的抽象方法,这也是一种多态的体现。**注意:**
  • 抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
  • 抽象方法必须由子类来进行重写。
  • 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包 含有其他方法。
  • 抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
  • 子类中的抽象方法不能与父类的抽象方法同名。
  • abstract不能与final并列修饰同一个类。
  • abstract 不能与private、static、final或native并列修饰同一个方法。

二、接口

接口是抽象类的延伸,在Java语言中仅支持单继承,也就是说一个类只能继承一个父类。但是接口却不同,一个类可以实现多个接口。接口可以理解为对一组功能的封装。

实例:定义一个接口擦除Erase,提供抽象方法erase(),Pencil实现了Erase,所以必须重写其方法。

public class Demo02 {    public static void main(String[] args) {        Erase pencil=new Pencil();//多态        pencil.erase();    }}interface Erase{    //擦除的方法    void erase();}class Pencil implements Erase{    @Override    public void erase() {        System.out.println("用铅笔写的字实现了擦除");    }}
  • 接口使用interface关键字定义
  • 一个类实现implements了接口,就需要重写接口中的所有抽象方法
  • 如果一个类实现了接口,没有重写所有的抽象方法,这个类也需要定义为抽象类
  • 接口也是一种引用数据类型,可以定义变量, 接口引用可以指向实现类的对象
  • 接口中的成员变量,默认使用public static final修饰
  • 接口中的方法默认使用public abstract修饰

抽象类与接口的区别

  1. 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
  2. 抽象类要被子类继承,接口要被类实现。
  3. 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
  4. 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
  5. 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
  6. 抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
  7. 抽象类里可以没有抽象方法。
  8. 如果一个类里有抽象方法,那么这个类只能是抽象类。
  9. 抽象方法要被实现,所以不能是静态的,也不能是私有的。
  10. 接口可继承接口,并可多继承接口,但类只能单根继承。
原创粉丝点击