面向对象的三大特征
封装
封装的必要性
什么是封装
概念
- 进坑隐藏对象内部实现细节,控制对象的修改及访问的权限。
访问修饰符
- private(可将属性修饰为私有,仅本类可见),私有属性在类的外部不可访问
公共访问方法
- 以访问方法的形式,进而完成赋值与取值操作。
访问修饰符
get、set方法是外界访问私有属性的唯一通道,方法背部可对数据进行检测和过滤。
继承
程序中的继承
- 程序中的继承是类与类之间特征和行为的一种赠与或获得
- 两个类之间的继承关系,必须满足“is a”的关系
- 多个类别都可以作为“狗”的父类,需要从中选择出合适的父类
- 功能越精细,重合点越多,越接近直接父类
- 功能越粗略,重合越少,越接近Object类。
父类的抽象
语法
class 子类 extends 父类{} //定义子类时,显示继承父类
继承的特点
- Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加。
不可继承
- 构造方法:类中的构造方法,只负责创建本类对象,不可继承。
- private修饰的属性和方法:访问修饰符的一种,进本类可见。
- 父子类不在同一个package中时,default修饰的属性和方法。访问修饰符的一种,仅同包可见。
访问修饰符
本类 | 同包 | 非同包子类 | 其他 | |
---|---|---|---|---|
private | y | n | n | n |
default | y | y | n | n |
protected | y | y | y | n |
public | y | y | y | y |
方法覆盖
- 子类中可以定义和父类相同的方法
- 当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行覆盖
方法覆盖原则
- 方法名、参数列表、返回值类型必须与父类相同
- 访问修饰符不能比父类更严格
方法覆盖的执行
- 子类覆盖父类方法后,调用时优先执行子类覆盖后的方法
super关键字
- 自子类中,可直接访问从父类集成到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽、方法覆盖)时,需要加以区分,才可专项访问。
super访问方法
- super.方法名()
继承中的对象创建
- 在具有继承关系的对象创建中,构建子类对象会先构建父类对象
- 由父类的共性内容,叠加子类的独有内容,组合成完整的子类对象
继承后的对象构建过程
- 构建子类对象时,先构建父类对象。
多态
概念
- 父类引用指向子类对象,从而产生多种形态。
- 二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。
- 父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。
多态中的方法覆盖
- 实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法。
- 使用场景
- 使用父类作为方法形参实现多态,使用方法参数的类型更为广泛
- 使用父类方法返回值实现多态,使用方法可以返回不同子类对象。
向上、向下转型
向上转型(装箱)
- 父类引用中保存真实子类对象,称为向上转型(即多态核心概念)。
- 仅可调用Animal中所生命的属性和方法。
向下转型
类型转换异常
- 向下转型时,如果父类引用中的子类对象类型和目标类型不匹配,则会发生类型转换异常
instanceof关键字
-
向下转型前,应判断引用类型中的对象真实类型,保证类型转换的正确性。
-
语法:
引用 instanceof 类型 //返回boolean类型结果
总结
- 父类的引用指向子类对象,从而产生多态。
- 多态的两种应用场景
- 使用父类作为方法形参,实现多态;
- 仅使用父类作为方法返回值,实现多态。
- 多态的作用
- 屏蔽子类间的差异
- 灵活、耦合度低。