抽象类
抽象类的概念
在面向对象中对象是通过类来描述,但不是所有的类都是来描述对象的,今天我们学习的类它主要是被继承的,那么什么类是主要被继承的?如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。比如:
Animal类它是所有动物的总称里面包含eat()成员方法,但是它不是一个具体的动物,不可以描述一个具体的对象
但是Animal类是可以被继承的,比如Dog具有Animal的eat()行为所以可以继承Animal。
说明:
1.Animal是动物类,每个动物都有吃的方法,但由于Animal不是一个具体的动物,因此其内部eat()方法无法具体实现。
2.Dog是狗类,首先狗是动物,并且具有Animal中的eat()行为,因此与Animal是继承关系,其次狗是一种具体的动物,狗吃:狗吃饭,其eat()可以实现
3.Cat是猫类,首先猫是动物,并且具有Animal中的eat()行为,因此与Animal是继承关系,其次猫是一种具体的动物,猫吃:猫吃饭,其eat()可以实现
抽象类的语法
在Java中用abstract修饰的类是抽象类,用abstract修饰的方法是抽象方法。抽象方法不能给出具体的实现(如果给出具体实现会报错)。
抽象类的特性
1.被abstract修饰的类称为抽象类
2.被abstract修饰的方法称为抽象方法
3.抽象类中也可以有普通成员变量、普通成员方法、构造方法
4.final,static修饰的方法不能被重写,而抽象方法的作用就是被重写的,所以final,static不能修饰抽象方法
5.private不能修饰抽象方法
7.抽象类不能被实例化
8.抽象类在被继承时一定要重写抽象类中的抽象方法,不然会报错
重写之后
9.在一个B类继承一个抽象类A后,B类不想重写A类的抽象方法,这是我们可以把B类加一个abstract修饰,那么这时B类就变成抽象类并且也不用写A类的抽象方法,但是如果有一个C类来继承B类那么此时需要写A和B两个抽象类的抽象方法
10.抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
11.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
12.当一个类中含有抽象方法的时候,该类必须使用abstract修饰
13.抽象类既然不能被实例化那么要它有什们用呢?
就是我前面说的被继承,然后子类重写抽象类的方法,完成子类自己的行为
抽象类的作用
抽象类本身是不能被实例化的,那么要想使用,就要创建抽象类的子类,然后让子类重写抽象类中的抽象方法。
普通类也是可以被继承的,那为什么要写抽象类呢?
那是因为抽象类被继承时一定要重写抽象类的抽象方法,这就相当与多一重编译器的校验。
使用抽象类的场景就如上面的代码,实际工作不应该由父类完成,而应该由子类完成,那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。(这里不应该由父类完成,而应该由子类完成,就是向上转型,然后调用子类重写父类的,重写方法)。