抽象类(abstract):
抽象方法: 将共性的行为(方法)抽取到父类后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法。
抽象类:是一个特殊的父类,类中可以定义抽象方法,也可以定义普通方法,类中存在抽象方法,必须声明为抽象类
抽象类的注意事项:
- 抽象类不能实例化,不能创建对象(如果能创建对象,就能调用抽象方法,但是抽象方法没有方法体)
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 可以有构造方法
抽象类的子类:要么重写抽象类中的所有抽象方法、要么定义成抽象类
抽象类成员特点:
- 成员变量:可以是变量, 也可以是常量
- 成员方法:可以是抽象方法, 也可以是普通方法
- 构造方法:有构造方法
问题 : 抽象类既然不能创建对象, 那为什么要有构造方法 ?
交给子类通过==super()==进行访问的.
结论 : 抽象类中除了可以定义抽象方法之外, 其他的跟普通类一样
abstract关键字的冲突:
final:被 abstract 修饰的方法,强制要求子类重写,而被 final 修饰的方法子类不能重写
private:被 abstract 修饰的方法,强制要求子类重写,而被 private 修饰的私有方法,子类不能重写
static:被 static 修饰的方法可以类名调用,但类名调用抽象方法没有意义
接口(interface):
含义:体现的思想是对规则的声明,Java的接口体现对行为的抽象
接口的使用场景:一个类中所有的方法,都是抽象方法,就是在声明规则,则定义成接口
接口的注意事项:
- 接口不能实例化
- 接口和类之间是实现关系,通过implements关键字表示
接口的实现类: 要么重写接口中的所有抽象方法、要么定义成抽象类
接口中的成员特点 :
- 成员变量:只能是常量, 因为默认被 public static final修饰,三个关键字没有顺序关系
- 成员方法:只能是抽象方法, 因为默认被 public abstract修饰
-
接口和类之间的各种关系 :
类和类:继承关系, 只支持单继承, 不支持多继承, 但是可以多层继承
- 类和接口:实现关系, 可以单实现, 也可以多实现, 甚至可以继承一个类的同时, 实现多个接口
-
抽象类和接口的设计理念区别 :
抽象类 : 共性(共同功能)
-
多态:
多态的前提条件:
要有继承或者实现关系
- 要有方法重写
-
多态的成员访问特点 :
构造方法:同继承一样,子类会通过 super 访问父类构造方法
- 成员变量:编译看左边 (父类), 运行看左边 (父类),是父类的引用
- 成员方法:编译看左边 (父类), 运行看右边 (子类),会运行子类的逻辑,担心父类中是抽象方法
- 静态成员 : 编译看左边 (父类), 运行看左边 (父类),因为默认会使用类名调用,所以运行也看左边
多态的好处:提高了程序的扩展性
如:定义方法的时候,使用父类类型作为形参,该方法就可以接收这父类的任意子类对象
多态的弊端:不能使用子类独有的成员变量和方法
- 问题: 非要调用怎么办 :
- 建议直接创建子类对象调用
- 向下转类型
多态中的转型问题 :
向上转型(隐式转换):从子到父、Fu f = new Zi();
向下转型(强制转换):从父到子、Zi z = (Zi)f;
ClassCastException (类型转换异常):被转换的引用类型变量,对应的实际类型和目标类型不是同一种类型
判断一个对象是否是一个类的实例:对象名 instanceof 类型
简单记:(对象名 instanceof 类型)判断关键字左边的对象,是否是右边的类型,返回boolean类型结果