在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
父类包含了子类集合的常见的方法,但由于父类本身抽象,所以不能使用这些方法。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
抽象类面向对象编程的核心是面向抽象编程,一般依赖抽象不依赖具体:
public class A{
public void pp(Pig pig){} 如果进行切换类型,则必须进行修改源代码
}
public class A{
public void pp(Animal animal){} 这里可以任意更换Animal的子类
}
class Pig extends Animal{}
class Cat extends Animal{}
包含了抽象方法的类叫作“抽象类”,所谓的抽象方法是指没有函数体的方法,抽象方法必须在子类中给 出具体实现,而抽象类本身不能创建对象。 public abstract class A{}
抽象类的特点
- 如果一个类中有抽象方法则这个类一定是抽象类
- 抽象类中可以定义的内容与普通类一样,只是可以定义抽象方法
- 抽象类中可以没有抽象方法
- 普通类继承抽象类必须实现抽象类中所有的抽象方法
- 抽象类一般是用来定义规范的,该规范的实现是通过子类来实现的
抽象类不可以被实例化
- 方法只有声明没有实现时,该方法就是抽象方法【不是空实现方法体,没有{}】,需要被abstract修 饰,否则语法报错。抽象方法必须定义在抽象类中,该类必须也被abstract修饰
- 不能定义抽象静态方法
- 抽象类不能直接创建对象,只能通过继承的方式由子类实现对应的抽象方法;
- 所有抽象类的子类必须实现抽象父类中的所有抽象方法或者自己也声明成抽象类【没有实现所有的 抽象方法】
- 抽象类除了可以有抽象函数,也可以有非抽象函数
是因为调用抽象方法没有意义?
抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类 强调:注意抽象类中可以包含构造器、析构器、抽象方法和方法以及静态方法等,也可以没有抽象方法
什么时候使用抽象类
- 当一个类的一个或多个方法为抽象方法时
- 当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时
- 当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时
抽象类和普通类的区别
- 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误
- 抽象类允许(但不要求)
- 抽象类包含抽象成员 抽象类不能被密封(简单说就是被final修饰的类,密封类不能被继承,防止了恶意的派生)



