面向对象:
⭐为什么要使用面向对象?
1.难以面对现代复杂系统的需求,编程的复杂度急剧上升,代码的冗余度高。
2.关联的信息难以组织和内聚。
3.面向过程的行为所属不明确。
面向对象的三大基本特征:封装、继承、多态。
封装
封装是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,控制用户对类的修改和访问数据的程度。
权限控制修饰符:
名称 | 当前类 | 同包不同类 | 子类 | 不同包下面的其他类 |
---|---|---|---|---|
private | √ | |||
默认不写 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
继承:
⭐为什么用到继承?重复代码多、难以维护,代码重用,简化系统,减轻负担。
手段方法:
抽取共同属性和行为, 让有些类基于共同类拓展特有属性;
语法:
class 子类名 extends 父类名{……}
⭐直系亲爹只能有一个(一个子类最多只能有一个直接的父类)
子类:
(1)重新定义:
变量隐藏:子类中重新定义父类中已有的变量。
如何访问:子类中访问父类变量 使用关键字super。
(2)重写:子类有个方法与父类的方法完全一致叫做重写。
重写的好处:不同实现、拓展、不影响共同行为。
怎么调用父类同名方法:使用super关键字, super.方法名(参数);
方法重写和重载的对比:
对比项 | 重写(Override) | 重载(Overload) |
---|---|---|
位置 | 父类(接口)和子类之间 | 同一个类内,或者父子关系中 |
方法签名 | 必须一致 | 必须不一致 |
返回值 | 必须相同(兼容) | 没要求 |
数量 | 被一个子类覆盖最多一次 | 数量无限制 |
注解 | @Override |
super关键字
作用项 | 用法说明 |
---|---|
调父类属性 | 访问父类被隐藏的实例变量,如:super.variable |
调父类方法 | 访问父类被重写的实例方法,如:super.method(参数); |
调用父类的构造函数 | super()必须是子类构造函数第一个执行的语句,如果super()没有被用到,每个超类的默认的或无参数的构造函数将被执行 |
⭐super关键字引用的是父类对象,所以不适合在static方法中使用。
多态:
-
简单来说,多态是具有表现多种形态的能力的特征
-
同一个实现接口使用不同的实例而执行不同操作
-
子类重写父类的方法
-
编写方法时,使用父类定义的方法
-
运行时,根据实际创建的对象类型动态决定使用哪个方法
向上转型
-
上转型对象会失去子类对象新增的属性和行为(具体与笼统)
-
可以访问被子类继承的属性、方法、被重写的方法,但不能操作子类新增的成员。
-
子类重写了父类的某个方法后,上转型对象调用这个方法时一定是执行这个被重写过的方法。
向下转型
并不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型。
instanceof
-
必须是该了类的上转型对象才能被成功下溯成该了类对象(对象本身类型兼容本身类型)否则会板类型转换异常
-
使用instanceof关键字用来判断当前对象是否是类的一个实例。