一. 概念
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
二. 代码
public abstract class employee {
private String name;
public employee(String name) {
this.name = name;
}
public double coumpute() {
return 1;
}
}
我们虽然不能实例化一个抽象类,但是我们可以实例化一个抽象类的非抽象子类,也就是如果一个非抽象类继承了抽象类,这个非抽象类是可以继承的
三. 抽象方法
Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//其余代码
}
注意:
- 如果一个类包含抽象方法,那么这个类必定是抽象类
- 任何子类都必须重写父类的抽象方法,如果不重写的话它就得声明自己也是抽象类
四. 与接口进行比较
共同点
- 都不能被实例化
- 都可以包含抽象方法
- 都可以用默认实现的方法
不同点
- 接口主要是对类的行为进行约束,实现了接口就必须具有那个行为;抽象类则更加强调的是代码复用,所属关系
- 一个类只能继承一个抽象类但是可以实现多个接口
- 接口中的成员变量只能说public static final,不能被修改且必须有初始值。而抽象类的成员变量默认default,可在子类中被重新定义和赋值
五. 总结
- 抽象类不能被实例化
- 抽象类中不一定含有抽象方法,什么方法都可以有,但是有抽象方法的类一定是抽象类
- 抽象类中的抽象方法只是声明,不包含方法体也就是不给出方法的具体实现(具体功能)
- 构造方法、类方法(用static实现的方法)不能是抽象方法
- 任何子类都必须重写父类的抽象方法,如果不重写的话它就得声明自己也是抽象类
- abstract关键字不能与final连用,因为abstart类是要被继承的,连用了就相当于抽象类没用了