Java 抽象类和接口
抽象类
关键字: abstract
抽象类特点:
- 方法只有声明没有实现时, 该方法就是抽象方法, 需要被 abstract 修饰,
抽象方法必须定义在抽象类中, 该类必须也被 abstract 修饰 - 抽象类不可以被实例化. 因为抽象方法没有方法体, 调用抽象方法没有意义
- 抽象类的子类必须覆盖父类的所有抽象方法后, 该子类才可以实例化
抽象类的细节
- 抽象类不可以被实例化, 但是有构造函数. 用于给子类对象进行初始化.
- 抽象类中可以不定义抽象方法, 但是很少见. 目的就是不让该类创建对象. AWT 的适配器对象就是这种类.
通常这个类的方法有方法体, 但是却没有内容.
abstract class Demo
{
void show1()
{}
void show2()
{}
}
- 抽象关键字不可以和下列关键字共存:
- private, 抽象类中的方法需要被子类覆盖, 私有之后, 找不到该方法, 无法达到覆盖的目的
- static, 静态修饰的内容可以直接用类名调用, 但是抽象方法没有方法体, 调用之后, 没有意义
- final, 被 final 修饰的类不能被继承, 方法不可以被覆盖
- 抽象类和一般类的异同点:
- 相同点
- 抽象类和一般类都是用来描述事物的, 都在内部定义了成员
- 不同点
- 一般类有足够的信息描述事物
抽象类描述事物的信息有可能不足 - 一般类中不能定义抽象方法, 只能定义非抽象方法
抽象类中可定义抽象方法, 同时也可定义非抽象方法 - 一般类可以被实例化
抽象类不可以被实例化
- 一般类有足够的信息描述事物
- 相同点
- 抽象类一定是个父类. 因为需要子类覆盖其方法后才可以对子类进行实例化
接口 (interface)
格式: interface {}
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一中形式定义和表示, 就是接口(interface)
// 抽象类
abstract class AbsDemo
{
abstract void show1();
abstract void show2();
}
// 接口
interface Demo
{
public abstract void show1();
public abstract void show2();
}
备注:
- 定义接口使用的关键字不是 class, 是 interface
- 接口编译后, 仍然是 .class 文件
接口中常见成员: 全局常量和抽象方法. 这些成员的修饰符是固定的
- 成员常量: public static final
- 成员函数: public abstract
- 接口中的成员都是 public 的
接口的出现将 "多继承" 通过另一种形式体现出来, 即"多实现"
- 类与类之间是单继承关系
- 类与接口之间是实现关系 (implements), 而且类可以继承一个类的同时实现多个接口
- 接口与接口之间可以有继承关系, 而且接口可以多继承.
因为接口没有方法体, 多继承在类中无法实现, 是因为同名方法体在调用时, 产生不确定性.
interface CC
{
public abstract void show();
}
interface MM
{
public abstract void method();
}
interface QQ extends CC,MM
{
public abstract void function();
}
class WW implements QQ
{
// 需要覆盖 3 个方法
public void show(){}
public void method(){}
public void function(){}
}
接口的特点
- 接口是对外暴露的规则
- 接口是程序的功能扩展
- 接口的实现降低耦合性
- 接口可以用来多实现
接口和抽象类的异同点
- 相同点
- 都是不断向上抽取而来的
- 不同的
- 抽象类需要被继承, 而且只能单继承
接口需要被实现, 而且可以多实现 - 抽象类中可以定义抽象方法和非抽象方法, 子类继承后, 可以直接使用非抽象方法
接口中只能定义抽象方法, 必须全由子类去实现 - 抽象类的继承是 is a 关系, 是在定义该体系的基本共性内容
接口的实现是 like a 关系, 是在定义该体系的额外功能
- 抽象类需要被继承, 而且只能单继承
类与对象的关系
类与接口的关系
参考资料