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