Java 三大特征
封装、继承、多态。
封装
尽可能隐藏对象的实现细节,控制对象的修改及其访问权限。
访问修饰符:private(设置属性为私有,仅本类可见)。
set/get 方法是外界访问私有属性的唯一通道,方法内部对数据进行检验过滤。
提供公开方法,可以确保数据的正确赋值。
说明:其实封装在生活中非常常见,就好比你想让别人看到的东西,就暴露出来;而你不想让别人看到的就隐藏起来。
继承
程序中的继承,是类与类之间特征和行为的一种赠与和获得。
两个类的继承关系,必须满足"is a"关系。
在继承中,父类的选择和抽取非常重要。
那如何选择父类呢? 父类功能越精细,子类和父类重合点越多,就越接近父类。
那如何抽取父类呢? 根据程序需要使用到的多个具体类,将其共性(特征和行为)进行抽取,进而定义父类,实现重用。
产生继承关系之后,子类中可以使用父类中的属性和方法,也可以定义子类独有的属性和方法。
好处:提高了代码复用性和可拓展性。
Java 为单继承,一个类只有一个直接父类,但可以多级继承,属性和方法叠加。
那么什么不可以继承呢?
-
构造方法
- 类中的构造方法,只负责创建本类对象,不可继承。
-
private 修饰的属性和方法
-
父子类不在同一个包内,default 修饰的属性和方法
访问修饰符
| 本类 | 同包 | 非同包子类 | 其他 | |
|---|---|---|---|---|
| private | √ | × | × | × |
| 缺省 | √ | √ | × | × |
| protected | √ | √ | √ | × |
| public | √ | √ | √ | √ |
方法重写
为什么要方法重写?
当父类提供的方法无法满足子类需求时,可在子类中和父类相同的方法进行重写(Override)。
方法重写的要求
- 方法名、参数列表、返回值类型必须与父类相同。
- 访问修饰符可与父类相同或比父类更宽泛。
执行顺序
子类重写父类方法后,调用时优先执行子类重写后的方法。
super 关键字
使用方法:
- 在子类中使用
super.形式访问父类的属性和方法。 - 在子类构造方法首行,使用
super()或super(实参),调用父类构造方法。 - 如果子类构造方法中没有显示定义
super()或super(实参),默认提供super()。 - 同一构造方法中,
this()和super()不可同时出现。
继承关系下的对象创建
在具有继承关系的对象创建中,构建子类对象会先构建父类对象。
继承关系对象创建流程
构建父类对象 -> 初始化自身属性 -> 执行自身构造方法中的逻辑代码
多态
父类引用指向子类对象,从而提供产生多态的前提条件。
多态的前提
- 类与类之间要存在直接或间接的继承关系
- 父类引用指向子类对象。
父类仅可调用父类声明所声明的属性和方法,不可调用子类独有的属性和方法。
场景
- 使用父类作为方法形参实现多态,实际传递子类对象,使方法参数的类型更为宽泛。
- 使用父类作为方法返回值实现多态,实际范围子类对象,使方法可以返回不同子类对象。
作用
- 屏蔽子类之间的差异。
- 灵活、耦合度低。