02-封装,继承,多态
1. 封装
- 概念:尽可能隐藏对象的内部实现细节,控制对象的修改和访问权限
- 访问修饰符: private (可将属性修饰为私有,仅本类可见)
- get/set方法是外界访问对象私有属性的唯一通道,方法内部对属性检测和过滤
- 提供public公共访问方法,以保证数据可以正常录入和访问
1 |
|
2. 继承
- 程序中的继承,是类与类之间特征和行为的一种赠予或获得。
- 类与类之间必须满足 is a 的关系。
①父类的选择
- 功能越精细,重合点越多的,就越接近直接父类。
②父类的抽象
- 根据程序需要使用到的多个具体类,进行共性提取,进而定义父类。
- 在一组相同或类似的类中,抽取特征和行为,定义在父类中,实现重用。
③继承语法
- class 子类名 extends 父类名{ } //定义子类时,显式定义父类
- 产生继承关系之后,子类可以使用父类的属性和方法,也可以定义子类独有的属性和方法。
④完整的子类
- 完整子类 = 父类共性 + 子类独有
- 好处:提高代码的复用性,又提高代码的可扩展性
- Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加。
不可继承
- 构造方法:类中的构造方法,只负责创建本类对象,不可继承;
- private修饰的属性/方法:仅本类可见,不可继承;
- 父子类不在同一个package中,default修饰的属性和方法,不可继承;
汇总:
- 本类都可访问
- public都可访问
- default同包内可以访问
- protected非同包子类,有继承关系
跨包访问
- 写全限定名(包名.类名),eg: java.util.Arrays.copyOf(…);
- 导包(import),eg: import java.util.Arrays;
方法的覆盖
- 当父类提供的方法无法满足子类的需求时,可在子类中定义和父类相同的方法进行覆盖(Override)
- 方法覆盖原则:
- 方法名称、参数列表、返回值类型必须与父类相同;
- 访问修饰符应与父类相同或更宽泛;
- 执行机制:子类覆盖父类方法后,调用时优先执行子类覆盖后的方法;
super 关键字
- 子类去访问父类重名的属性或方法时(属性遮蔽/方法覆盖),使用super.专项访问
- super() 默认调用父类无参构造方法,隐式存在
- super(参数) 指定调用父类有参构造方法,显式调用
1 |
|
this与super:
- 同一个子类构造方法中,super()和this()不可同时存在
- 当子类构造中使用了this()或this(实参),即不可再同时书写super()或super(实参),会由this()指向的构造方法完成super()的调用
继承关系下的对象创建:
- 继承关系下构建子类对象时,会先构建父类对象
- 由”父类共性” + “子类独有” 组合成一个完整的子类对象
继承关系下的对象创建流程
- ① 构建父类对象
- ② 初始化自身属性
- ③ 执行自身构造方法中的逻辑代码
1 |
|
3. 多态
- 概念:父类引用指向子类对象,从而产生多种形态。
eg: Animal a = new Dog();
- 二者具有直接或者间接的继承关系时,父类引用可指向子类对象,形成多态。
- 父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。
多态的两种应用场景
- 场景① 父类类型引用作为方法的形参,实现多态,使方法参数的类型更为宽泛 (该父类的任何一个子类均可作为实参传入)
- 场景② 使用父类类型作为方法返回值,实现多态,使方法可以可以返回不同的子类对象
1 |
|
向上转型(装箱) - <多态核心概念>
- 父类引用中保存真实子类对象。
- eg: Animal a = new Dog(); // 对象层面的自动类型转换
- 仅可调用父类中所声明的属性和方法(遵循属性遮蔽/方法覆盖原则)
向下转型(拆箱)
将父类引用中的真实子类对象,强转回子类本身类型。
eg: Animal a = new Dog();
Dog dog = (Dog)a; // 对象层面的强制类型转换
Cat cat = (Cat)a; // Error: 不是真实子类对象new Dog(),编译OK,运行则会抛出类型转换异常:java.lang.ClassCastException
只有转回子类真实类型,才可调用子类独有的属性和方法。
向下转型前应该判断引用中的对象真实类型,保证类型转换的正确性
- 语法: 父类引用 instanceof 类型 // 返回boolean类型结果
1 |
|
02-封装,继承,多态
https://janycode.github.io/2016/04/28/02_编程语言/01_Java/01_JavaSE/02_面向对象/02-封装,继承,多态/