08_抽象类和接口

文章目录

  • 抽象类
    • 抽象方法的语法
    • 抽象类的语法
    • 抽象类的特点
    • 抽象类的使用
    • 注意事项
  • 接口
    • 接口的定义
    • 接口的特点
    • 接口的使用
    • extends `VS` implements
    • 默认方法和静态方法
    • 接口`VS`抽象类
    • 方法传参
    • 方法的返回值
    • 方法重写中的返回值类型问题
    • 链式调用

抽象类

抽象方法的语法

权限修饰符 abstract 方法返回值类型 方法名(形参列表)

说明

  • 抽象方法没有方法体,不用实现
  • 抽象方法必须要在抽象类中

抽象类的语法

权限修饰符 abstract 类名{ 类体}

说明

  • 权限修饰符:public 或者默认
  • 抽象类的类名:一定要大驼峰,一般习惯命名位AbstractXxxx 或者BaseXxxx
  • 抽象类不可以创建对象

抽象类的特点

  1. 类名命名特点是什么? 大驼峰,Base或者Abstract开头
  2. 能用哪些修饰符?public 或者 默认
  3. 成员特点
    1. 普通成员 OK
    2. 静态成员 OK
    3. 抽象方法 OK
  4. 构造器 OK
  5. 代码块 OK

结论:一个抽象类,普通类有的抽象类都有,抽象类就是在普通类的基础上多了一个抽象方法

抽象类的使用

  1. 普通类继承抽象类
    如果子类是一个普通类,要实现抽象父类中的所有抽象方法
  2. 如果子类是一个抽象类,可以选择性的实现抽象父类中的抽象方法
  3. 抽象类还可以继承普通类
  4. 上层的类越来越抽象,下层的类越来越具体

注意事项

  1. abstract关键字,不能用来修饰构造器、属性、代码块等结构。只能修饰类或者方法。

  2. abstract修饰类时,类的修饰符不能有final。

  3. abstract修饰方法时,该方法不能有修饰符:

    • private
    • static
    • final
  4. 一个抽象类中可以没有抽象方法,但是没有意义

接口

接口的定义

权限修饰符 interface 接口名{}

说明

  1. 权限修饰符跟class一样
  2. inerface关键字表示接口,跟class具有同等的地位,也是引用数据类型
  3. 接口名要求大驼峰
  4. 接口中可以放抽象方法,跟抽象类一样
  5. 一个类可以继承接口,不用extends,用implements(实现)来表示,通常继承某个类,实现某个接口
  6. 一个类实现了某个接口,这个类就是接口的子类,接口是这个类的父接口
  7. 一个类同时可以满足既继承了某个父类,又实现了某个接口,并且这个类可以实现多个接口
    语法权限修饰符 class 类名 extends 父类 implements 接口 ----> 注意顺序不要错了
    并且这个类可以实现多个接口
    语法权限修饰符 class 类名 (extends 父类) implements 接口1, 接口2 ...
  8. 接口是可以继承的,并且是多继承

接口的特点

  1. 接口的声明特点
    1. 接口能不能创建对象? NO
    2. 接口能不能用final修饰? NO
  2. 接口的实现类的书写格式
  • 命名:
    • 接口的命名 习惯以IXxx 大驼峰
    • 接口实现类的命名:习惯以xxxImpl
  • 定义了一个接口,某个类实现这个接口的时候有一些要求:
    • 在定义接口的位置,新建一个包impl,里面写接口的实现类,或者在接口的位置,直接写实现类
    • 接口中大部分都是抽象方法
  1. 成员特点
    1. 能否定义属性(成员变量, 静态成员变量, 全局常量)?
      默认是public static final -----> 都是全局变量,隐藏的单词不用写出来
    2. 能否定义方法/行为?
      普通方法默认都是public abstract抽象方法,隐藏的单词不用写出来
      可以有静态方法,但是一般不用
  2. 构造器 NO
  3. 代码块 NO

总结
接口的特点
接口里可以定义全局常量、静态方法、抽象方法

  • 大多数情况下,接口里面只放抽象方法,比如CloseableRunnableCallable
  • 特殊情况下,接口里面不放任何东西,比如CloneableSerializable,表示是一个空接口,起到标记的作用
  • 实现接口的类,如果没有明确继承一个其他类,那么子类对象的隐式初始化super()指向Object类。
  • 接口虽然不是类,但是它也继承了Object类。

接口的使用

  1. 子类是普通类,要求实现接口中的所有的抽象方法
  2. 子类是抽象类,子类可以自由实现
  3. 接口可以继承一个接口,并且接口在继承接口后,可以重写父接口中的抽象方法和默认方法

extends VS implements

  • 继承(extends)是不能跨越种族的,类和类继承,接口和接口继承,接口和类之间没有继承关系。
    • 普通类继承一个抽象类,需要实现里面的所有抽象方法。
    • 抽象类继承一个抽象类,按需实现里面的抽象方法。
    • 抽象类继承一个普通类,是可以的。
    • 接口在继承一个接口后,会得到接口的所有抽象方法。
    • 类的继承是单继承的,接口的继承是多继承的。
  • 实现(implements),必须发现在类与接口之间,接口和类是没有任何关系的。
    • 普通类实现接口,必须实现所有抽象方法
    • 抽象类实现接口,按需实现抽象方法

默认方法和静态方法

接口中可以有:
默认方法:默认public
语法

default 返回值类型 方法名(形参列表){
	// 方法体
}

静态方法:默认public
语法

static 返回值类型 方法名(形参列表){
	// 方法体
}

调用方式:接口名.静态方法名

接口VS抽象类

08_抽象类和接口_第1张图片

方法传参

  1. 形参如果写一个普通类:调用方法时需要传入的是该类的对象或者该类的子类对象
  2. 形参如果写一个抽象类:调用方法时需要传入的是该抽象类的子类对象
  3. 形参如果写一个接口:调用方法时需要传入的是该接口的子类对象

方法的返回值

  1. 返回值类型如果写一个普通类:可以返回该类的对象或者该类的子类对象
  2. 返回值类型如果写一个抽象类:返回该抽象类的子类对象。
  3. 返回值类型如果写一个接口:返回该接口的子类对象。

方法重写中的返回值类型问题

引用类型:不必保持一模一样,存在自动向上转型。

  1. 类:父类中的方法返回一个普通类类型
    • 子类方法中可以返回该类型
    • 也可以返回该类的子类类型
  2. 抽象类:父类中的方法返回一个抽象类类型
    • 子类方法可以返回该类型
    • 也可以返回抽象类的实现类类型
  3. 接口:父类中的方法返回一个接口类型
    • 子类方法可以返回该类型
    • 也可以返回接口的实现类类型

链式调用

eg:

new StudentDemo().getStudent().show();

你可能感兴趣的:(JavaSE,java)