抽象即不清楚的,如抽象画一样
在java中抽象用abstract关键字来表达抽象。举个例子:
动物都会叫,但是没有具体怎么叫,对于不同的动物有不同的叫法,如猫叫喵,狗叫汪,羊叫咩,牛叫哞等等。我们就可以把动物叫表达为抽象
运行结果:
抽象方法:
1)从上面的例子中我们可以看出,抽象方法没有主体(speak()没有{}包起来的业务逻辑),所以我们没法直接调用抽象方法
2)抽象方法不能用private修饰,因为抽象方法只能有子类去复写,而private的权限对于子类来说是不能访问的,所以就会产生矛盾
3)抽象方法也不能用static修饰,如果用了static修饰,父类可以直接调用抽象方法,可是抽象方法没有主体,没有任何业务逻辑,这样就毫无意义
抽象方法没有主体测试
在抽象方法中加上{},报错
报错信息为:Abstract methods do not specify a body
抽象类:
1)用abstract关键字来表达的类,其表达形式为:(public)abstract class 类名{}
2)抽象类不能被实例化,即没法直接new一个抽象类。抽象类本身就代表了一个类型,无法确定为一个具体的对象,所以不能实例化就合乎情理了,只能由它的继承类实例化
3)抽象类虽然不能被实例化,但是可以有自己的构造方法
4)抽象类不能用final关键字修饰,因为final修饰的类无法被继承,而对于抽象类来说就是需要通过继承去实现抽象方法,这又会产生矛盾
5)抽象类与接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类中可以有实例方法,并实现业务逻辑
抽象类不能被实例化测试
报错信息为Cannot instantiate the type Animal
抽象类可以有自己的构造方法
从结果来看,和普通的继承类一样,在new 一个子类对象时会优先调用父类(这里指的是抽象类
Animal)的构造器初始化,然后再调用子类的构造器。
抽象类的好处
1、由于抽象类不能被实例化,最大的好处就是通过方法的覆盖来实现多态的属性。也就是运行期绑定
2、抽象类将事物的共性的东西提取出来,由子类继承去实现,代码易扩展、易维护。
抽象类与抽象方法的关联
如果一个类中至少有一个抽象方法,那么这个类一定是抽象类,但反之则不然。也就是说一个抽象类中可以没有抽象方法。这样做的目的是为了此类不能被实例化
如果一个类继承了抽象类,必须全部复写抽象类中的全部抽象方法,如果没有全部复写,这个子类也必须是抽象类(这样做就无意义了)