1.1 概述
抽象类是用来捕捉子类的通用特性的,父类中的方法可以看做是模板方法,被多个子类重写,子类根据自己的需求重写这个模板方法,所以父类的方法主体就没有存在的意义了,我们把使用abstract关键字修饰没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类。
1.2 abstract使用格式
抽象方法
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
定义格式:
//修饰符 abstract 返回值类型 方法名 (参数列表);
public abstract void method();
抽象类
如果一个类包含抽象方法,那么该类一定是是抽象类(反之不一定成立)。
定义格式:
//abstract class 类名
public abstract class Animal {
public abstract void run();
}
1.3 抽象类和抽象方法的使用
继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。所有不是抽象类的子类必须实现该父类的所有抽象方法,否则父类定义的抽象方法无法被使用,就失去了抽象方法的意义。
/**
* 父类,同时也是个抽象类
*/
public abstract class Animal {
public abstract void run();
}
/**
* 子类
*/
public class Dog extends Animal{
/**
* 子类重写父类的抽象方法
*/
@Override
public void run() {
System.out.println("我是一只小狗,喜欢被溜");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
}
}
// 输出结果: 我是一只小狗,喜欢被溜
1.4 注意事项
- 抽象类不能创建对象,只能由子类继承并且重写父类所有的抽象方法来使用,否则,编译无法通过而报错。除非该子类也是抽象类。
- 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用。
- 抽象类中,可以定义普通的成员变量和成员方法,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
1.5 扩展 abstract 不能与哪些关键字连用?
- private
因为抽象方法设计的意义就是需要子类重写其抽象方法,private修饰的方法子类继承不到,更不能重写。 - final
final关键字修饰的方法不能被重写。 - static
抽象方法没有方法体,静态方法需要在类初始化的时候分配内存空间,还有静态方法可以直接类名.调用,抽象方法没有方法体没有意义。 - synchronize
使用synchronize关键字需要具体的同步实现的,抽象方法没有方法体,冲突。 - native
native 生命的方法是移交本地操作系统实现的,抽象方法是需要子类继承抽象方法并实现的,所以冲突。
总结
抽象类与普通类的区别只有不能创建对象、可以存在抽象方法两种区别,如果想使用抽象类,必须要由子类继承并且重写父类的所有抽象方法,如果子类也是也是个抽象类则不用重写。