在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
如何定义抽象类:
在访问修饰符后添加一个abstract关键字就可以将该类定义为抽象类。
如何定义抽象方法:
抽象方法和抽象类的定义很相似,都是在访问修饰符后添加一个abstract关键字。我们要注意的是abstract只能用在普通方法,不能使用在被static关键字修饰的方法和构造方法中。
了解抽象抽象方法:
抽象方法是定义在抽象类中,它只能出现在抽象类中,当在抽象类中我们也可以定义非抽象方法。
当一个非抽象类去重写一个抽象类时,它必须去重写这个抽象父类中的所有抽象方法。所有抽象方法的访问修饰符不能被 private 修饰,因为在子类重写抽象类中的抽象方法时,需要进行访问。如果声明了private子类就不能对抽象父类中的抽象方法进行重写了。
抽象方法没有方法体。
例:在非抽象类中重写抽象类
抽象类:
子类:
了解抽象类和接口的同和不同
相同点:
可以定义多个抽象方法,在非抽象子类重写抽象方法和实现接口时,必须要在子类中重写抽象方法。
接口和抽象类都不能被实例化。
不同点:
抽象类可以存在构造方法,而接口中不能定义构造方法。
抽象类可以定义非抽象方法,而接口中的方法都是抽象方法。
抽象类中可以定义各种类型的成员变量,而在接口中声明的变量只能是常量。
抽象类只支持单继承,接口支持多继承。
抽象类中可以存在有方法体的方法,而接口的方法都是抽象方法,不能有方法体。
接口中都方法都是共有的。
回顾我们的抽象类:
抽象类不能被实例化,如果被实例化,会在编译阶段就报错。只有继承抽象类的非抽象子类能被实例化。
抽象类中的方法可以不是抽象方法,但抽象方法只能定义在抽象类之中。
构造方法和被static关键字修饰的方法不能被abstract关键字修饰。
抽象类的抽象方法没有方法体,就是没有实现功能的具体方法。
一个类继承了一个抽象类,如果这个类也是抽象类,那么它就可以不去重写继承抽象类的抽象方法。如果是其他类就必须要进行抽象。
抽象类中的抽象方法不能是被private访问修饰符修饰的,否则子类不能对其进行重写。