抽象类(abstract):

抽象方法: 将共性的行为(方法)抽取到父类后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法。
抽象类:是一个特殊的父类,类中可以定义抽象方法,也可以定义普通方法,类中存在抽象方法,必须声明为抽象类

抽象类的注意事项:
  • 抽象类不能实例化,不能创建对象(如果能创建对象,就能调用抽象方法,但是抽象方法没有方法体)
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 可以有构造方法

抽象类的子类:要么重写抽象类中的所有抽象方法、要么定义成抽象类

抽象类成员特点:
  • 成员变量:可以是变量, 也可以是常量
  • 成员方法:可以是抽象方法, 也可以是普通方法
  • 构造方法:有构造方法

问题 : 抽象类既然不能创建对象, 那为什么要有构造方法 ?
交给子类通过==super()==进行访问的.
结论 : 抽象类中除了可以定义抽象方法之外, 其他的跟普通类一样

abstract关键字的冲突:

final:被 abstract 修饰的方法,强制要求子类重写,而被 final 修饰的方法子类不能重写
private:被 abstract 修饰的方法,强制要求子类重写,而被 private 修饰的私有方法,子类不能重写
static:被 static 修饰的方法可以类名调用,但类名调用抽象方法没有意义

接口(interface):

含义:体现的思想是对规则的声明,Java的接口体现对行为的抽象
接口的使用场景:一个类中所有的方法,都是抽象方法,就是在声明规则,则定义成接口

接口的注意事项:
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字表示

接口的实现类: 要么重写接口中的所有抽象方法、要么定义成抽象类

接口中的成员特点 :
  • 成员变量:只能是常量, 因为默认被 public static final修饰,三个关键字没有顺序关系
  • 成员方法:只能是抽象方法, 因为默认被 public abstract修饰
  • 构造方法:没有构造方法

    接口和类之间的各种关系 :
  • 类和类:继承关系, 只支持单继承, 不支持多继承, 但是可以多层继承

  • 类和接口:实现关系, 可以单实现, 也可以多实现, 甚至可以继承一个类的同时, 实现多个接口
  • 接口和接口:继承关系, 可以单继承, 也可以多继承

    抽象类和接口的设计理念区别 :
  • 抽象类 : 共性(共同功能)

  • 接口 : 特性(扩展功能)

    多态:

    含义:同一个对象,在不同时刻表现出来的不同形态

    多态的前提条件:
  • 要有继承或者实现关系

  • 要有方法重写
  • 要有父类引用指向子类对象

    多态的成员访问特点 :
  • 构造方法:同继承一样,子类会通过 super 访问父类构造方法

  • 成员变量:编译看左边 (父类), 运行看左边 (父类),是父类的引用
  • 成员方法:编译看左边 (父类), 运行看右边 (子类),会运行子类的逻辑,担心父类中是抽象方法
  • 静态成员 : 编译看左边 (父类), 运行看左边 (父类),因为默认会使用类名调用,所以运行也看左边

多态的好处:提高了程序的扩展性
如:定义方法的时候,使用父类类型作为形参,该方法就可以接收这父类的任意子类对象
多态的弊端:不能使用子类独有的成员变量和方法

  • 问题: 非要调用怎么办 :
  1. 建议直接创建子类对象调用
  2. 向下转类型

多态中的转型问题 :
向上转型(隐式转换):从子到父、Fu f = new Zi();
向下转型(强制转换):从父到子、Zi z = (Zi)f;
ClassCastException (类型转换异常):被转换的引用类型变量,对应的实际类型和目标类型不是同一种类型
判断一个对象是否是一个类的实例:对象名 instanceof 类型
简单记:(对象名 instanceof 类型)判断关键字左边的对象,是否是右边的类型,返回boolean类型结果