面向对象的三大特征
封装,继承,多态
一、封装
基本思想:决定属性和行为归属谁的问题
- 定义一个人类:姓名,年龄,学习,吃饭
- 定义一个圆类:半径,画圆(行为)
- 定义一个票类:票价,买票(行为) ->不写在人类里面,写在票类;用人去调用买票,即票被买了,大家都可以调用这个方法去买票;想做某件事就去找可以做这件事的对象
如何更好的封装?
- 成员变量建议private私有化,只能在本类中访问
- 合理暴露:提供成套的setter和getter方法去赋值和取值
1.1 标准JavaBean
实体类(学生类,汽车类) -> 创建对象,封装数据
标准Bean的书写要求:
- 成员变量私有
- 成套setter和getter方法
- 无参构造器
二、继承
相同的属性,相同的方法 -> 抽取出来相同的特征 -> 定义一个新的类 -> 原来的类与新类之间建立关系
关键字:extends,两个类之间建立起父子关系 (格式:子类 extends 父类)
好处:提高代码复用性
创建一个子类对象,对外是一个对象,但是内部有两个空间
2.1 继承的特点
-
子类可以继承父类的属性和行为,但是不能继承父类的构造器
-
子类不能继承父类构造器
-
子类是否能继承父类的私有成员?(存在争议)
继承了,但是不能直接访问
-
子类是否能继承父类的静态成员?(存在争议)
不算继承,只是共享了,static只有一个
-
-
Java是单继承模式,一个类只能继承一个直接父类
-
Java不支持多继承,但是支持多层继承
-
Java中所有的类都是Object类的子类
2.2 成员变量,成员方法访问特点
就近原则:子类局部,子类成员,父类(指定访问:this,super)
2.3 方法重写
继承体系中,子类出现和父类一模一样的方法声明,称子类的方法是重写的方法
@Override重写注解
放在重写后的方法上,作为重写是否正确的校验注解
注意事项和要求
- 重写方法的名称和形参列表必须和被重写的方法名称和参数列表一致
- 私有方法不能被重写
- 子类重写方法访问权限大于等于父类
- 子类不能重写父类的静态方法
2.4 继承后子类构造器的特点
子类的全部构造器默认会先访问父类的无参构造器再执行自己
为什么?
- 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
- 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。
怎么调用父类构造器的?
子类构造器的第一行语句默认都是:super(),不写也存在。
2.5 this,super
关键字 | 访问成员变量 | 访问成员方法 | 访问构造方法 |
---|---|---|---|
this | this.成员变量 -> 访问本类成员变量 | this.成员方法 -> 访问本类成员方法 | this(…) |
super | super.成员变量 -> 访问父类成员变 | super.成员方法 -> 访问父类成员方法 | super(…) |
注意:
this和super只能放在构造器第一行,且一个构造器内super和this只能存在一个
三、多态
什么是多态?同类型对象,执行同一个行为,会表现出不同的行为特征
多态的常见形式:
父类类型 对象名 = new 子类构造器;
接口 对象名 = new 实现类构造器;
多态侧重行为多态:方法调用:编译看左边,运行看右边。变量:编译左,运行右。
优势:
- 在多态形势下,右边对象可以实现解耦,便于扩展和维护。
- 定义方法,使用父类型作为参数,接收一切子类对象
多态下不能访问子类独有的功能 -> 强制类型转换(有继承或者实现关系编译时可以强制转换,但可能出现问题,转型后的类型和对象真实类型不是同一种类型,出现ClassCastException) 使用instanceof判断
学习笔记链接: 黑马程序员