Java中的抽象类和接口

来源:互联网 发布:嵌入式转人工智能领域 编辑:程序博客网 时间:2024/06/03 13:06

  Java是一个面向对象的编程语言,它的源程序是由若干个类组成,源文件是扩展名为.Java的文本文件。类是Java中最基本的组成单元,Java将描述一类事物的属性(状态)和功能(行为)封装在一起,属性用成员变量来刻画;功能通过方法来提现。
  Java面向对象的三大特征:封装、继承、多态。封装和继承几乎都是为多态准备的。在我的理解中,Java的抽象类和接口及其应用正是这三大特征的集中提现。

1.抽象类

  在面向对象的的领域一切都是对象,同时所有的对象都需要通过类来描述,但并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,并且需要其他具体的类来支撑它,那么这样的类我们称作抽象类。
  换种说法:在继承的层次结构中,每个新子类都使类边的越来越明确和具体。如果从一个子类追溯到父类,类就会变得更通用、更加不明确。类的设计应该确保父类包含它子类的共同特征。有时候,一个父类设计得非常抽象,以至于它没有任何具体的实例。这样的类就叫做抽象类。
  
  在使用抽象类的时候需要注意几点:
  1.抽象类不能被实例化,实例化的工作由继承该抽象类的子类完成;
  2.子类继承抽象类时,必须实现父类中的所有方法;
  3.如果一个类中含有抽象(abstract)方法,那么这个类必须用abstract来修饰【抽象类中可以没有抽象方法,但抽象方法必须出现在抽象类中】;
  4.抽象类的设定,只关心继承该类的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现。
  
  实例:
  定义一个抽象动物类Animal,提供抽象方法cry(),猫、狗都是动物类的子类,因为cry()为抽象方法,所以子类必须要实现cry()方法。如:

public abstract class Animal{    public abstract void cry(); }public class Cat extends Animal{    public void cry(){        System.out.println("喵喵喵");    }}public class Dog extends Animal{    public void cry(){        System.out.println("汪汪汪");    }}public class Text{    public static void main(String[] args){        Animal cat = new Cat();        Animal dog = new Dog();        cat.cry();        dog.cry();    }}---------------------------------------------Output:喵喵喵汪汪汪

2.接口

  接口在很多方面都和抽象类类似,但是它的目的是指明相关或者不相关类的多个对象的共同行为。使用正确的接口,可以指明这些对象是可比较的、可食用的、以及可克隆的。
  为了区分接口和类,Java使用interface来定义接口。
  在Java中,接口可以看做一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件。接口的使用方法多多少少有点接近使用抽象类。例如,可以使用接口作为引用变量数据类型或者类型转换的结果等。和抽象类相似,不能用new操作符创建接口的实例。
  接口是用来建立类和类之间的协议,它提供的是一种形式,没有具体的提现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字,他表示该类再遵循某个或某组特定的接口,同时也表示着“interface只是它的外表,但是需要声明它是如何工作的”。
  接口是抽象类的延伸,Java为了保证数据安全不允许多重继承,即一个类只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷。

  接口的使用需要注意以下问题:
  1.一个接口(interface)的所有方法访问权限被自动声明为public,且只能为public;
  2.接口中可以定义“成员变量”,或者说是不可变的常量,访问权限默认为:public。可以通过类命名直接访问:ImplementClass.name;
  3.接口不可被直接实例化,但可以声明一个接口变量,该变量必须引用(refer to)一个实现该接口的类的对象;
  4.实现接口的非抽象类必须要实现该接口的所有方法【抽象类可以不实现】;
  5.接口中不存在实现的方法;
  6.在实现接口的时候要避免方法名的重复。

3.抽象类和接口的区别

  抽象类是对一种事物的抽象,即对类抽象;抽象类有抽象方法,而且和普通类一样,同样可以拥有成员变量和普通的成员方法;
  接口是一种规范行为;接口中的成员变量只能由public static final修饰;接口中的方法必须全部都是抽象方法。

  抽象类:对一类事物的抽象。
  接口:对某一行为的抽象。

  从设计思想和使用动机上来区分:
  设计抽象类是自下而上的的过程,因为调用者子类需要某些属性和特有行为,所以调用者继承抽象类;
  设计接口是自上而下的过程,接口规范某一行为,某类需要这一行为,调用者实现这一接口。
  开发者继承抽象类,是为了使用抽象类的属性和行为;
  开发者实现接口只是为了使用接口的行为。

4.附:面向对象常见概念深入解析图

  首次见到这张图的时候是在知乎,感觉很精髓。
  

原创粉丝点击