如果我们需要定义一个父类,此父类能为其子类声明结构却不能为方法定义有意义的实现过程。也就是说,有时候我们需要创建一个父类。此父类只定义可被其所有子类共享的一般形式,而让子类来补充细节,这种类就是抽象类。

抽象类的声明:

如果使用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()方法的实现细节。