一、概念:
①定义:拥有抽象方法的类就是抽象类,抽象类并不是说只有抽象方法,抽象类必须使用abstract关键字声明。
类即使不含抽象方法,也可以将类声明为抽象类
②与普通类的比较:普通类是一个完善的功能类,可以直接产生实例化对象;抽象类并不能直接产生实例化对象
二、使用:
a. 定义一个子类继承抽象类, 重写抽象类之中的全部抽象方法
b.如果子类没有全部重写父类的抽象方法,则必须将子类也必须定义为为abstract类
c. 可以直接访问静态变量和静态方法
d. 可以添加普通成员变量和普通成员方法,但是不可以直接访问,因为要求实例化
e.不能用final修饰抽象类或者抽象方法
abstract class Person { //抽象类必须使用abstract关键字声明
private String name; //可以添加普通成员变量,但不可以直接访问
public Person(String n){ //可以添加普通成员方法,但不可以直接访问
name=n;
}
public String getName(){
return name;
}
public abstract String getDescription(); //没有方法体的方法就是抽象方法,必须要使用abstract关键字修饰
}
public class Employee extends Person {
private double salary;
private Date hireDay;
public Employee(String n,double s,int year,int month,int day){
super(n);
salary=s;
GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
hireDay=calendar.getTime();
}
public String getDescription(){
return String.format("an employee with a salary of $%.2f",salary);
}
}
class Student extends Person{
private String major;
public String getDescription(){ //重写父类抽象方法
return "a student majoring in"+major;
}
/*
@param n the student's name
@param m the student's major
*/
public Student(String n,String m){
super(n); //pass n to superClass constructor
major=m;
}
}
public class test {
public static void main(String[] args) {
Person[] people=new Person[2];
people[0]=new Student("王伟","数学");
people[1]=new Employee("李四",20000,1989,10,1);
for(Person p:people){
System.out.println(p.getName()+","+p.getDescription());
}
}
}
三.抽象类中的向上转型
当子类继承抽象类的时候,则抽象类成为父类,这个时候利用向上转型可以产生多态。