抽象类
用修饰符abstract修饰类,可以定义抽象类。
抽象类的可以定义抽象方法,或者说有定义抽象方法的类必须是抽象类,抽象方法不能有方法的实现代码体。
抽象类中可以有普通方法,并且abstract只能修饰方法,不能修饰属性。
// 用修饰符abstract定义抽象类publicabstractclassAbstractClass{// 用修饰符abstract定义抽象方法,抽象方法不能有方法体publicabstractvoidsay();publicabstractvoidrun();// 可以定义普通方法publicvoidshow(){System.out.println("抽象类中的普通方法");}// 可以定义变量,变量不能用abstract修饰publicStringname;publicintage;}抽象类不能被new实例化,要实例化,需要在子类重写抽象方法。(当然,子类也可以是抽象类,此时就可以继续抽象下去,无需实现父类的抽象方法)在抽象类的子类实例化对象后,可以利用多态特性,让抽象类的引用指向子类的对象。
publicclassImplementClassextendsAbstractClass{// 实现父抽象类的抽象方法@Overridepublicvoidsay(){System.out.println("say");}// 实现父抽象类的抽象方法@Overridepublicvoidrun(){System.out.println("run");}}publicclassApp{publicstaticvoidmain(String[]args){// new AbstractClass(); 无法实例化抽象类// 可以实例化抽象类的已重写抽象方法的子类AbstractClassa=newImplementClass();a.run();// 调用抽象类中,已重写抽象方法的子类方法a.show();// 调用继承抽象类的非抽象方法}}为什么会有抽象类?抽象类是介于接口和普通实现类的中间过渡,既有类的特性,又有接口的特性:
- 像接口一样,能够定义抽象方法,抽象方法可以理解成定义一套规范。这套规范指导子类,并且强制要求子类实现。
- 像类一样,能够定义实现方法,让子类直接继承抽象父类的具体已实现的方法。
- 像类一样,是单继承关系,不想接口一样支持多继承。某些场景下单继承可能是更优选择。
接口
接口是比抽象类更完全的抽象,接口使用interface定义。由于接口必须用于其他类进行实现,所以必须是public公开的,因此不能定义private、default、protected。
接口也可以不用public做修饰符,即非全局访问,限制只有同包类可以访问。
// 包私有接口,只有同包类可以访问interfacePackagePrivateInterface{}// 公共接口,所有类都可以访问publicinterfacePublicInterface{}与抽象类中可以有抽象方法和非抽象方法不同,接口中的方法必须是抽象方法(Java8以前)。并且由于抽象方法必须是公开的,所以可以不需要定义修饰符,因为隐式使用 public abstract 。
publicinterfaceDemo{// 公开的抽象方法(隐式 public abstract)voidsayHello();// 公开的默认方法(必须是 public)defaultvoiddefaultMethod(){privateHelper();}// 私有方法(Java 9+)privatevoidprivateHelper(){// 只能在接口内部调用}}在Java8之后,接口除了有抽象方法外,还可以有默认方法、静态方法和私有方法。
- 默认方法:使用
default关键字修饰,有方法体。实现类可以直接继承或重写它。- 静态方法:使用
static关键字修饰,有方法体。属于接口自身,通过接口名.静态方法名()调用。- 私有方法:使用 private 关键词修饰,只能在接口内部调用。
与抽象类相似,接口也不能实例化,必须通过子类重写抽象方法进行实现。但是抽象类使用extends关键字标记子类,而接口使用implement关键字标记实现接口的类。
publicclassDemoImpimplementsDemo{// 重写(实现)接口中的抽象方法@OverridepublicvoidsayHello(){System.out.println("hello");}@OverridepublicvoidsayHi(){System.out.println("hi");}}与抽象类不同,接口可以多继承,子类必须重写多个接口的抽象方法。
publicclassDemoImpimplementsDemo0,Demo{// 需要重写多个继承接口的全部方法。}