如果我们需要定义一个父类,此父类能为其子类声明结构却不能为方法定义有意义的实现过程。也就是说,有时候我们需要创建一个父类。此父类只定义可被其所有子类共享的一般形式,而让子类来补充细节,这种类就是抽象类。
抽象类的声明:
如果使用abstract 修饰一个类,这个类就是抽象类。抽象类创建的语法格式如下:
abstract class 类名
{
//抽象类的实现代码
}
例如,下面创建一个员工抽象类Employee:
abstract class Employee
{
int basic_salary=2000;
abstract void salary();
}
abstract 修饰符可与类和方法一起使用,来声明抽象类和抽象方法。
定义抽象类的目的是提供可由其子类共享的一般形式,这样类就可以根据自己的需要扩展该抽象类。
抽象方法就是没有实现细节的方法,必须在该抽象类的子类中提供此方法的实现。例如: abstract void salary();
要注意,抽象方法没有实现的细节,它的定义中没有花括号。有花括号但花括号中没有任何的方法,仍然不是抽象方法。如:void notAbstractFun(){}
如果一个类中有一个抽象方法,那么这个类就是抽象方法,就是说必须含有抽象方法的类前面加上abstract 关键字,否则会出错。
在以下情况下,某个类将称为抽象类:
(1)当一个类的一个或者多个方法是抽象方法时;
(2)当该类是一个抽象类的子类,并且没有为所有抽象类方法提供实现细节或方法主体时;
(3)当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时。
抽象类的使用
如果一个类是抽象类,就不能创建这个类的对象,也就是说,一个抽象类不能通过new操作符直接实例化,必须使用继承的方法来访问抽象类中的成员。换句话说,抽象类的作用就是用来继承。
继承抽象类的类必须在类中实现抽象类中的抽象方法,即给出抽象方法的定义。
下面演示一个例子:
abstract class Employee{
int basic_salary=2000;
abstract void salary();
}
class Manager extends Employee{
//@Override
void salary() {
// TODO Auto-generated method stub
System.out.println("薪水等于"+basic_salary*5);
}
}
class Worker extends Employee{
//@Override
void salary() {
// TODO Auto-generated method stub
System.out.println("薪水等于"+basic_salary*2);
}
}
public class AbstractDemo {
public static void main(String arg[]){
Manager m=new Manager();
System.out.println("经理");
m.salary();
Worker w=new Worker();
System.out.println("工人");
w.salary();
}
}
运行结果如下:
经理
薪水等于10000
工人
薪水等于4000
在以上程序汇总,方法salary()是一个抽象方法,因此Employee类也必须被声明为抽象类。Manager类和Worker类继承Employee类并提供salary()方法的实现细节。