Java 中的抽象类与接口

I. 抽象类

1.抽象方法

把多个共性的东西提取到一个类中,这是继承的做法,但是这多个共性的东西,在有些时候,方法声明一样,但是方法体不一样。也就是说方法声明一样,但是每个具体的对象在具体实现的时候内容不一样,所以我们在定义这些共性方法的时候,就不能给出具体的方法体。而一个没有具体方法体的方法就是抽象方法 (Abstract Method)

public abstract methodName();
//抽象方法没有 {} ,花括号就是有方法体,不过是空方法体

2.抽象类

如果一个类中有抽象方法,这个类必须被定义为抽象类 (Abstract Class)

public abstract class ClassName{}

3.抽象类的特点

  • 抽象类和抽象方法必须用关键字 abstract 修饰
  • 抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
  • 抽象类不能直接实例化,但是可以通过多态的方式进行实例化
abstract class Animal{}
class Cat extends Animal{}

class Demo{
	public void static main(String[] args){

	Animal a = new Animal(); // 错误,抽象类不能直接实例化

	Animal a = new Cat(); //正确,可以用多态进行实例化
}
}
  • 抽象类的子类
    • 可能是抽象类, 即子类不重写所有抽象方法
    • 也可能是具体类,即子类必须重写抽象类中的所有抽象方法

4.抽象类的成员特点

  • 成员变量
    • 成员变量可以是变量
    • 成员变量也可以常量(final)
  • 构造方法
    • 抽象类有构造方法,但是不能用构造方法来实例化抽象类,这个构造方法是用于子类访问父类数据的初始化
  • 成员方法
    • 抽象方法:强制子类要操作的方法
    • 非抽象方法:子类继承的方法,用于提高代码复用性

5. 抽象类的几个小问题

  • 抽象类的构造方法不能实例化,那构造方法有什么用
    • 但是用于子类访问父类数据的初始化
  • 一个类如果没有抽象方法,却定义成抽象类,有什么用?
    • 为了不让其他类创建该类的对象
  • abstract 不能和哪些关键字共存?
    • final: 被final修饰的方法不能被重写,abstract 要求重写
    • private: 被private修饰的方法不可被继承,不可被重写,而 abstract 要求重写
    • static:被static修饰的方法可以通过类名直接访问,无意义

II.接口

1.接口

一些子类的特殊行为,不是这些子类的共性,比如说, 猫钓鱼,狗看家 这些行为,既不是他们的父类 动物类 所具备的,也不是所有的猫和狗都具备的。这种额外的行为,在 Java 中,以接口 interface 的形式提供访问。接口的意义就是用于定义额外的功能,如果某个类具有这些额外的功能,那么就实现这个接口。

2.接口的特点

  • 接口用关键字 interface 修饰
interface InterfaceName{}
  • 接口的类实现用 implements
class InterfaceNameImpl implements InterfaceName{}
  • 接口不能实例化,但可以通过多态来实例化
  • 接口的实现类
    • 可以是一个抽象类,但意义不大
    • 也可以是一个具体类,需要重写接口中的所有抽象方法

3. 接口的成员特点:

  • 成员变量:
    • 只有常量,接口的成员变量默认是以 public static final 修饰的,修饰符可以省略。这也叫枚举常量
  • 构造方法:
    • 接口没有构造方法,接口的子类默认的是 Object 类的无参构造
  • 成员方法:
    • 只有抽象方法,接口的成员方法默认是以 public abstract 修饰的,修饰符可以省略; 子类重写接口的方法时,权限必须是 public

4. 类与类,类与接口, 接口与接口

  • 类与类
    • 继承关系,只能单继承,但可以多层继承
  • 类与接口
    • 实现关系,可以单实现,也可以多实现,还可以在继承的同时实现多个接口
  • 接口与接口
    • 继承关系,可以单继承,也可以多继承

III. 抽象类与接口的区别

1.成员区别

  • 成员变量
    • 抽象类:可以是变量,可以是常量
    • 接口: 只能是常量
  • 构造方法
    • 抽象类: 有抽象方法,用于子类访问父类的数据初始化
    • 接口: 没有抽象方法
  • 成员方法:
    • 抽象类: 可以是抽象方法,也可以是非抽象方法
    • 接口: 只能是抽象方法

2.设计理念的关系

  • 抽象类:抽象类被继承,体现的是 is a 的关系 (共性功能)
  • 接口: 接口被实现,体现的是 like a 的关系 (扩展功能)

Share this on