抽象类刻画公共行为特征,但并没有在抽象类内部实现这些公共行为,而是通过继承由派生类实现具体公共行为
相关知识
(1)抽象类是用abstract 修饰的类
(2)含有抽象方法的类一定是抽象类
(3)抽象类中不一定含有抽象方法
(4)抽象类不能实例化对象
抽象方法
用abstract 修饰的类称为抽象类,用abstract 修饰且只有方法声明没有方法体的方法称为抽象方法
定义一个抽象类
abstract class 抽象类名 {
//数据成员
//构造方法
[访问权限] 返回值类型 方法名(形参列表) {//普通方法
//方法体
[return 返回值]
}
[访问权限] abstract 返回值类型 方法名 (形参列表); //抽象方法,无方法体
}
Java程序对抽象类的要求
(1)抽象类中可以有零个或多个抽象方法,也可以包含非抽象方法,下面代码,workOn ()为抽象方法,仅有声明,没有方法体
abstract class Person{
public void talk ( ) { } //普通方法
abstract void workOn ( ) //抽象方法
}
(2)抽象类中可以不定义抽象方法,但抽象方法的类必须是抽象类,上面代码中,Person 类定义了抽象方法workOn (),因此必须用abstract 修饰Person类
(3)抽象类可以派生子类,如果派生实体子类,实体子类必须实现抽象类中定义的抽象方法;如果派生抽象子类,抽象子类可以不实现抽象父类的抽象方法
// 抽象父类
abstract class Person {
public void talk (){ } //普通方法
abstract void workOn (); //抽象方法
}
// 实体子类
class Teacher extends Person{
void workOn () { //实体类,覆写父类抽象方法
System.out.println("教师授课");
}
}
// 抽象子类
abstract class Student extends Person {
// 没有实现父类的抽象方法workOn ()
abstract void study (); //抽象方法
}
上面代码中,Teacher 是Person 类的实体子类,必须实现抽象方法workOn(),Student 为Person 的抽象子类,可以不实现抽象方法workOn(),同时定义抽象方法study()
(4)抽象类不能实例化对象,由抽象类拍派生的实体子类实例化抽象父类对象
// 抽象类
abstract class Person { }
// 实体子类
class Teacher extends Person{ }
public class Demo {
public class void main (String [ ] args ) {
Person.swk = new Person ; //编译错误
Person.zbj = new Teacher ; //通过编译
}
}
上面代码中, 使用抽象类实例化swk对象(直接调用抽象类的构造方法),提示编译错误;
使用Person 类的实体子类 Teacher 实例化对象zbj(调用实体子类的构造方法),通过编译
(5)抽象类中能定义构造方法,但不能直接调用抽象类的构造方法实例化对象
(6)抽象父类和抽象子类不能有方法名与形参列表相同的抽象方法,即抽象方法不能重载
(7)abstract 和 final 不能修饰同一个类,因为final 修饰的类不能被继承,如果抽象类不能被继承就没有子类覆写抽象方法,抽象类没有存在的意义
(8)abstract 不能与 private 、 static 、 final 或 native 等同时修饰一个方法