抽象类与接口

Fighting.jpg

抽象方法和抽象类特点

抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义为抽象类,抽象类中可以没有抽象方法。

  • 抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。

  • 抽象类不能被实例化

  • 抽象类可以包含成员变量、方法、构造器、初始化代码块、内部类,因为不能被实例化,所有这些都是被子类调用

  • 含抽象方法的类,只能被定义为抽象类

  • 抽象方法必须为public或者protected(如果为private,则不能被子类继承,子类无法实现该方法就没有其价值),缺省的情况下默认为public

  • abstract 不能修饰成员变量,不能用于修饰局部变量,即没有抽象变量、抽象成员变量说法;也不能修饰构造器、没有抽象构造器,抽象类中的构造器只能时普通的构造器

  • 使用abstract修饰类时,即表明这个类只能被继承。当使用abstract修饰方法时,表明这个方法必须由子类提供实现。而final修饰的类不能被继承,final修饰的方法不能被重写。因此final和abstract是不能够同时使用的。

  • static修饰一个方法时,表明这个方法属于该类本身,即通过类就可调用该方法,但该方法被定义为抽象方法,即通过该类不能调用没有方法体的方法。 但是static和abstract可以修饰内部类

抽象类的作用

  • 抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给其子类实现
  • 父类总可能包含需要调用其他系列方法的方法,这些被调方法既可以有父类实现,也可以由子类实现。

接口

接口定义基本语法

[修饰符] interface 接口名 extends 父接口1,父接口2
{
    零个到多个常量定义...     静态常量 
    零个到多个抽象方法定义...  
    零个到多个内部类、接口、枚举     默认采用了public static
    零个到多个默认方法或类方法定义
}

==Java 8接口==

  • 允许在接口中定义默认方法,但是必须使用default修饰,但不能使用static修饰, 总是使用public修饰的
  • 允许在接口中定义类方法,但必须使用static修饰,不能使用default修饰
  • 接口类的成员变量默认是使用public static final 修饰的

接口和抽象类的异同点

==相同点==

  • 接口和抽象类都不能被实例化,位于继承树的顶端,用于被其他类实现和继承
  • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法

==差别==

  • 设计目的上
    • 接口作为系统与外界交互的窗口,接口体现的是一种规范,对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务(以方法的形式来提供);对于接口的调用者来说,接口规定了调用者可以调用哪些服务,以及如何调用这些服务; 接口类制定了系统各模块应该遵循的标准,接口不应该经常被改变。一旦被改变,对整个系统都会有影响
    • 抽象类作为系统中多个子类的共同父类,体现的是一种模板式设计。
  • 一个类最多只能有一个直接父类,包括抽象类;但是可以直接实现多个接口
  • 接口里面只能定义静态常量,不能定义普通成员变量;抽象类中既能蒂尼静态常量又能定义普通成员变量
  • 接口里面不能有初始化代码块;但是抽象类完全可以包含初始化块
  • 接口里面只能包含抽象方法、静态方法、默认方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法
  • 接口里不包含构造器;抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成抽象类完成属于抽象类的初始化操作

后记

参考《疯狂Java讲义》

你可能感兴趣的:(抽象类与接口)