面向对象
1. 继承
-
当一个类继承了另一个类, 另一个类中所有的属性和方法,子类就天然具备了
-
Java中使用extends表示类的继承
Dog extends Animal
Dog为子类/派生类 Animal为父类/基类
-
继承原则
- 要能使用继承,前提必须满足类之间的is a关系.
- 一个子类只能使用extends继承一个父类(单继承).但是可以多层继承
- 子类会继承父类的所有属性和方法,
- 显示继承: public属性和方法可以直接使用.
- 隐式继承: private属性和方法无法直接使用.
- 通过使用父类提供的get/set使用属性
protected关键字
- 对于类的调用者来说, protected 修饰的字段和方法是不能访问的
- 对于类的 子类 和 同一个包的其他类 来说, protected 修饰的字段和方法是可以访问的
- private < default < protected < public
- protected > 包权限
- 同包下的没有关系的类之间以及 不同包的有继承关系的类之间可见.
super关键字
super修饰属性
- super先从直接父类中寻找同名属性, 不存在的话再向上寻找
- this直接从当前类中找同名属性,不存在再向上
super修饰方法
- 修饰构造方法
- 语法:
super(父类构造方法的参数)
,super(); //无参构造
- 若父类中不存在无参构造, 则子类构造方法的首行必须显示使用super(有参构造).
- 当产生子类对象时,默认先产生父类对象, 若父类对象还有继承,就继续向上
- 在一个构造方法中,不能同时使用this()和super(), 但是super()是隐式的.
- 语法:
- 修饰普通方法
- 直接从父类中寻找同名方法.
final关键字
- 修饰属性
- final修饰属性,表示属性不能变, 值定义后不能修改
- 修饰类
- 表示这个类无法被继承
2. 组合关系
- 类和类之间除了继承关系,还有组合关系
- 例如: school有teacher和student
3. 多态
- 多态是类在继承关系下的一种形态.
- 一个引用可以表现出多种行为/特性 => 多态性
- 多态就是同一方法对不同的子类对象所产生的不同的形态
- 同一个调用用同一个方法名,根据引用指向不同的对象可以表现出不同的行为.
- 最主要的多态: 继承 + 方法重写.
3.1: 向上转型
-
将一个子类对象赋值给父类引用, 这个过程就是向上转型.
-
最大的意义:向上统一化.
父类名称 父类引用 = new 子类实例();
Animal animal = new Dog();
-
向上转型发生在有继承关系的类之间.
-
new的对象不一定是直接子类, 也可以是孙子类
-
向上转型后,最顶端的父类引用可以指代所有的子类对象
- 向上转型之前
- 向上转型之后
- 向上转型之前
-
向上转型发生的时机
- 方法传参: 使用最多
- 直接赋值
- 方法返回值
类名称 引用名称 = new 类实例();
|引用名称.方法名称();
- 能通过’.方法’的方法类名称,是前面的类名称说的算, 能访问的这些方法必须都在类中定义过,编译器会先在类中查找是否包含指定方法.
- 至于这个方法到底表现出来是哪个类样子,实例所在的方法说的算
- 方法能不能调用看父类
- 方法能调用,但是是什么样子(表现出的具体行为)是看new的实例是通过哪个子类new的,该子类是否重写了该方法.
3.2: 向下转型
- 将父类引用强制类型转换为子类引用
- 想调用子类中特有的方法, 就要向下转型.
子类名称 子类引用 = (子类名称) 父类引用
|Dog dog = (Dog) animal
- 要发生向下转型: 首先要发生向上转型, 毫无关系的两个类之间无法强转.
- 当发生向下转型时会有风险,类型转换异常
3.3: 动态绑定
- 调用父类方法时, 根据父类引用指向的子类对象找到具体的方法进行调用
- 方法能不能调用看父类, 方法表现出的具体行为看子类的重写方法.
4. 抽象类
- 抽象类是普通类的’超集’, 只是比普通类多了一些抽象方法而已
- 抽象方法所在的类必须是抽象类, 子类若继承了抽象类, 必须重写所有的抽象方法(前提子类是普通类)
-
java中定义抽象类或者抽象方法使用abstract关键字
- 抽象方法指的是使用abstract关键字声明, 只有函数声明,没有函数体
-
若一个类使用abstract声明为抽象类, 无法直接通过该类实例化对象, 哪怕该类中一个抽象方法都没有.
-
子类继承了抽象类, 就必须强制子类覆写抽象类方法, 也满足单继承局限
-
抽象类就是普通类的超集(普通类有的,抽象类全都有), 只是比普通类多了一些抽象方法而已, 抽象类虽然没法直接实例化对象, 但是也可以存在构造方法, 子类在实例化时, 仍然遵从继承的规则, 先调用父类的构造方法, 而后调用子类的
5. 接口
- 接口表示具备某种能力/行为, 子类实现接口时不是
is a
, 而是具备这种行为或能力 - 接口表示一种规范或者标准.
- 接口中只有全局常量(1%可能会有)和抽象方法
- 使用关键字interface声明接口
- 子类使用implement实现接口, 必须覆写所有的抽象方法