JavaSE基础知识(5)—面向对象(抽象类和接口)

时间:2022-04-01 20:59:50

一、抽象类

1、理解

abstract关键字定义的类,称为抽象类
用abstract关键字定义的方法,称为抽象方法
意义:
当设计父类时,发现该父类根本不需要创建对象,并且里面有不好描述的方法。这个时候往往将该父类设计成抽象类!

2、abstract关键字

abstract属于一种修饰符,只能用于修饰类或方法,不能修饰属性、构造器、局部变量

3、抽象类

语法:
  [修饰符] abstract class 类名{}
特点:

①抽象类不可以使用final修饰符,原因:和抽象类的意义冲突(final修饰的类不可以被继承)
②抽象类中可以有普通成员,也可以有抽象方法
③抽象类中有构造器,目的:为了初始化信息
④抽象类不可以创建本类对象
⑤抽象类的扩展:子类继承抽象类时,如果子类是具体的实现类,要求必须实现抽象类中的抽象方法,否则,不用实现抽象类的抽象方法

4、抽象方法

语法:
  [修饰符] abstract 返回类型 方法名(参数列表);
特点:

①抽象方法没有实现体,只有方法签名,使用分号结尾
②修饰符不可以是private、static、final,因为违背了实现的意义
③抽象方法只能出现在抽象类或接口中,不能出现在具体的实现类中
④当含有抽象方法的类或接口,被实现类实现时,要求必须实现里面所有的抽象方法

二、接口

1、好处

①避免了单继承局限性
②接口的实现更加灵活,实现类和接口之间不再是is-a 的关系,仅仅需要 like-a 的关系
③提高代码的解耦性,降低依赖性

2、定义特点

①使用interface关键字定义,修饰符只能是public或默认
②jdk8之前,接口中只能是静态常量+抽象方法
  静态常量的修饰符,只能是public static final ,可以省略
  抽象方法的修饰符,只能是public abstract,可以省略
 jkd8对接口的改进:接口中可以有静态方法和默认方法
  静态方法:
    public static 返回类型 方法名(参数列表){
      //实现体
    }
  默认方法:
    pubilc default 返回类型 方法名(参数列表){
      //实现体
    }
jdk9对接口的改进:接口中可以有私有方法(jdk8增加了可以实现的方法,为了方法体中调用一些共同的代码,增加私有方法,供本接口内部使用)
  private 返回类型 方法名(参数列表){}

注意:

 当实现的接口和父类中有同名的实现方法时,子类默认执行的是父类的方法,遵循"类优先"原则
 当实现的多个接口中有同名的实现方法时,子类必须重写该方法,否则有歧义,编译报错

③接口中没有构造器
④接口不能创建本身对象

3、使用特点

①类可以实现多个接口,使用implements关键字
  class A implements 接口1,接口2{}
②类可以既继承父类,又实现接口
  class A extends B implements 接口1,接口2{}
③接口可以继承多个接口,使用extends关键字
  interface Inter extends 接口1,接口2{}
④普通的实现类实现接口的话,必须实现里面所有抽象方法;抽象类实现接口的话,不用全部实现所有抽象方法

三、抽象类和接口比较

 

定义关键字

构造器 创建对象本身 能否有普通成员 里面的属性 里面的抽象方法 继承
抽象类 abstract class 可以 无要求

不能是private、final、static,

其他修饰符可以

单继承
接口 interface 不可以

要求必须是静态的常量属性

修饰符只能是public static final,可以省略

jdk8之前只能是public abstract,可以省略

jkd8之后可以是静态方法和默认方法

jkd9之后可以是私有方法

多继承多实现