1:有抽象方法的类一定是抽象类:
首先我们先来解释一下什么是抽象类,在面向对象的概念中,所有的对象都是通过类来描述并创建的,但是有一种“特殊”的类,并不能用完整的信息来描述一个具体的对象,这样的类就是抽象类,在定义抽象类时,需要使用abstract关键字进行修饰,并且类体中至少包含一个抽象方法,其余内容和普通类一样,也可以定义普通常量,普通方法等,由于抽象类必须满足至少包含一个抽象方法,因此有抽象方法的类一定是抽象类。
2:抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类:
原因是:对于抽象类的子类,如果它没有实现抽象类中的所有方法,那么它必然包含抽象方法,它满足至少包含一个抽象方法,因此该类就是抽象类
3:抽象类不能被实例化:
我们知道类是对对象的具体描述,那么类可以相当于图纸,而对象可以相当于产品,抽象类不具体原因是它没有方法体或者说提供的成员不足以生成一个具体对象,拿生活实例举例,我们可以实例化出一个苹果,一个香蕉…,但是我们不能实例化出水果,因为水果是不具体的。
从java的角度分析,我们都知道java是面向对象的程序设计,如果我们想实现某个功能,那么功能中的方法需要通过对象去调用,而对象是什么呢? 对象就是类的实例,所有的对象都是类的实例,而抽象类无法生成一个具体的对象,因此抽象类是不能被实例化的。
其次我们还考虑到内存问题:对象进行实例化的时候,关键字new向Java申请内存,这个类的成员(成员变量,成员方法)会被保存到内存中,而抽象类没有具体的成员,因此没有办法准确的分配内存。
4:抽象类可以有抽象方法,但该抽象方法只需申明,无须实现:
首先先来解释一下什么是抽象方法,抽象方法是一种“特殊”的方法,该方法只有方法的定义部分(只有方法头)而没有方法的实现部分(没有方法体),在访问权限和返回类型之间需要用abstract关键字进行修饰
那么它为什么无须进行实现呢?原因是:**抽象类一般作为父类,在抽象类中定义抽象方法,并交给抽象类的子类去实现抽象方法,也就是说定义并完善某个具体对象的描述,我们是通过抽象类的各个子类去实现的,**比如将水果作为一个抽象类,其中可以包含一些抽象方法来描述其外观,口感,特点…,但对于具体的水果来说,并不是完全相同的,因此需要各自取实现抽象方法来完成自身不同的描述。
5:抽象方法不能声明为静态、不能被static、final修饰:
原因是:首先我们先来说说为什么抽象方法不能被final修饰,我们知道如果一个方法被final修饰,那么这个方法就只能被继承而不能被修改,但抽象方法是要被子类所覆盖的,如果仅仅是继承抽象方法,那么则毫无意义。
那么它为什么不能被static修饰呢?**由于被static修饰的方法属于类,该方法还是类的东西,而不是用来给子类继承的,**如果我们把类比作房子,那么被static修饰的方法就是房子中的一面墙,而抽象方法则可以为房子中的一张白纸,一个桌子等等,墙是没有办法通过继承而迁移的,但桌子,白纸等等,可通过继承将其进行覆盖等操作,抽象方法的存在本身就是为了通过继承和覆盖去完善某个具体对象的描述,如果使用static修饰抽象方法,则会导致该抽象方法无法被继承,那么也就失去了存在的意义。