一、抽象类
关键字:abstract,抽象的,可以修饰类和方法。
1)抽象方法,父类声明一个方法但不能提供方法实现,该方法的实现子类提供,这样的方法交抽象方法。
2)抽象类:有一个或更多抽象方法的类称为抽象类,前提是继承基础之上。抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
1.abstract修饰类:抽象类
(1)不可被实例化
(2)抽象类有构造器,可以重载多个=>凡是类都有构造器
(3)抽象方法所在类一定是抽象类
(4)抽象类里可以定义常量,变量,可以定义非抽象方法,但是方法包括{},也可以定义静态方法,方法也要有{},抽象方法不需要{}。
2.abstract修饰方法
(1)格式:没有方法体,包括{}。
(2)意义:抽象方法保留了功能,而且执行交给抽象类的子类,由子类重写此抽象方法。
(3)若子类继承抽象类,并重写所有抽象方法,则此类是一个实例类,即可实例化。反之,若没有重写所有方法,意味着此类仍有抽象方法,则必须声明类为抽象的。
3.abstract使用的限制
(1)不能和final一起使用:final是最终的,不能被修改,继承后不能重写。
(2)不能和static一起使用:"类名.方法名"调用方法,但abstract修饰的方法没有方法体。
(3)不能用来修饰属性:属性没有重写的说法。
(4)不能用来修饰构造器:构造器不能被重写。
(5)不能和private一起使用:抽象方法是建立在继承的前提下。
二、接口
关键字:interface。是一个特殊的抽象类,所有的属性值是常量,所有的方法是抽象方法。Jdk1.8以上可以定义静态方法,但是必须含有{},通常是由类实现接口然后重写抽象方法。
三、对比
(1)抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
(2)抽象类要被子类继承,接口要被类实现
(3)接口只能做方法申明。抽象类中可以做方法申明,也可以做方法实现。
(4)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
(5)抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
(6)抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
(7)抽象类里可以没有抽象方法。
(8)如果一个类里有抽象方法,那么这个类只能是抽象类。
(9)抽象方法要被实现,所以不能是静态的,也不能是私有的。
(10)接口可继承接口,并可多继承接口,但类只能单根继承。
(11)接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
四、什么时候使用抽象类和接口
(1)如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
(2)如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
(3)如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
原文地址:https://www.cnblogs.com/lyr999736/p/8878585.html