面向对象三大特征:封装、继承、多态
本篇为概念概述板块
详细知识框架梳理和实例明天更
9.1 引言
面向对象三大特性:封装、继承、多态。
9.2 封装
9.2.1 封装的必要性
- 在对象的外部,为对象的属性赋值,可能存在非法数据的录入。
- 就目前的技术而言,并没有办法对属性的赋值加以控制。
9.2.2 什么是封装
概念:尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限。
访问修饰符:private (可将属性修饰为私有,仅本类可见)
9.2.3 公共访问方法
以访问方法的形式,进而完成赋值与取值操作。
问题:依旧没有解决到非法数据录入!
- 提供公共访问方法,以保证数据的正常录入。
- 命名规范:
- 赋值:setXXX() //使用方法参数实现赋值
- 取值:getXXX() //使用方法返回值实现取值
9.2.4 过滤有效数据
在公共的访问方法内部,添加逻辑判断,进而过滤掉非法数据,以保证数据安全。
9.2.5 JavaBean 设计
类:实体类 JavaBean。
JavaBean 分为两种:1、数据承载Bean 2、业务逻辑Bean
数据承载Bean的要求
- 1、私有化属性
- 2、对外提供公共的set、get方法
- 3、提供有参无参构造
9.3 继承
9.3.1 生活中的继承
- 生活中的“继承”是施方的一种赠与,受方的一种获得。
- 将一方所拥有的东西给予另一方。
9.3.2 程序中的继承
- 程序中的继承,是类与类之间特征和行为的一种赠与或获得。
- 两个类之间的继承关系,必须满足“is a”的关系。
9.3.3 父类的选择
- 现实生活中,很多类别之间都存在着继承关系,都满足“is a”的关系。
- 狗是一种动物、狗是一种生物、狗是一种物质。
- 多个类别都可作为“狗”的父类,需要从中选择出最适合的父类。
- 功能越精细,重合点越多,越接近直接父类。
- 功能越粗略,重合点越少,越接近Object类。(万物皆对象的概念)
9.3.4 父类的抽象
实战:可根据程序需要使用到的多个具体类,进行共性抽取,进而定义父类。
在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用。
9.3.5 继承
继承概念:类与类之间属性和方法的赠与和获得
继承作用:减少代码的冗余,提高代码的复用性。
继承语法:子类 extends 父类
9.3.6 继承的特点
- 1、子类继承父类,可以继承父类中的属性和方法
- 2、子类可以拥有自己独有的属性和方法
- 3、单继承,即在java中一个子类只能继承一个父类。但是一个父类可以拥有多个子类
4、多重继承,即一个父类还可以继承另外一个类。java中最大的父类的是Object(如果一个没有显示的写出extends 父类,默认就是Object子类)
9.3.7 不可继承
- 1、构造方法不能被继承
- 2、父类的私有属性不能被继承
- 3、父类中使用默认的修饰符的修饰的属性和方法在不同包的子类中不能被继承
9.4 访问修饰符
9.4.1 访问修饰符
private私有的 default缺省的、默认的、友好的 protected 受保护的 public 公开的
修饰符 | 本类 | 本包(不同类) | 不同包子类 | 其他 |
private | √ | |||
默认的 | √ | √ | ||
protected | √ | √ | √ |
public | √ | √ | √ | √ |
9.5 方法重写
9.5.1 方法的重写/覆盖
子类中有与父类相同签名的方法称之为方法重写
重写的特点:
- 相同签名 :
方法名相同、参数相同、返回值相同、子类访问修饰符要比父类更宽泛
- 相同签名 :
方法名相同、参数相同、返回值相同、子类访问修饰符要比父类更宽泛
重写的作用:
- 因为父类的方法无法满足子类的需求,所以需要重写父类的方法
注解:@Override 建议在重写方法的时候,加上注解
- 检测是否是满足方法重写。必须满足重写的要求,否则报错
9.6 super关键字
9.6.1 super关键字
含义:直接父类的对象
作用:可以调用父类的属性、方法、构造方法
调用父类属性和方法的时候:
- 1、当子类与父类有重名属性和重名方法的时候,this.属性、this.方法名表示调用子类的属性和方法
- 2、当子类与父类有重名属性和重名方法的时候,super.属性、super.方法名表示调用父类的属性和方法
- 3、如果没有重名属性和方法,那么this和super表示的都是父类的属性和方法(子类继承而来)
- 调用父类的构造方法的时候:
- 注意:创建子类对象之前,必须要先创建父类的对象
- 1、super();调用的是父类的无参构造。是可以完全省略的,省不省略都会执行(建议:保留父类的无参构造)
- 2、 super调用父类的有参构造,要放到构造方法第一行。super和this不能同时出现
9.6.2 子类对象的创建过程
对象的创建过程:
1、开辟空间
2、实例化成员变量
3、执行构造方法
4、将创建的对象赋给对象名
继承后对象的创建过程
先创建其父类的对象,实例化父类的成员变量,执行父类的构造方法,
在创建子类的对象 ,实例化子类的成员变量,执行子类的构造方法
9.7 多态
9.7.1 生活中的人物视角
生活中,不同人物角色看待同一个对象的视角不同,关注点也不相同。
9.7.2 生活中的多态
生活中的多态是指“客观事物在人脑中的主观反应”。
主观意识上的类别与客观存在的对象具有“is a”关系时,即形成多态。
9.7.3 程序中的多态
概念:父类引用指向子类对象,从而产生多种形态。
二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。
父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。
9.7.4 多态的特点
- a、如果发生多态,那么调用的一定是子类重写的方法。
- b、如果发生多态,那么无法调用子类自己独有方法和属性。
9.7.5 多态的产生条件
- a、必须要有继承关系
- b、必须要有方法重写
- c、必须要有父类的引用指向子类的对象
9.7.6 向上转型和向下转型
如果发生多态要调用子类自己独有的方法和属性,那么需要发生向下转型。
但是发生向下转型之前必须要发生过向上转型
Pet pet = new Dog(); //向上转型 Dog d = (Dog)pet; //向下转型
9.7.7 instanceOf关键字
- 语法: 对象名 instanceof 类型
- 作用:判断该对象是否属于该类型。属于返回true,否则返回false
- 应用场景:在向下转型之前,最好先做一个判断。以免发生类型转换异常的错误
9.7.8 多态的应用场景
- 将参数改为父类类型,使用更加等宽泛和灵活
- 将返回值类型改为父类类型,更将灵活