本帖最后由 小石姐姐 于 2017-12-11 17:06 编辑
* 继承
* 概念: 从已有类派生出新的类, 已有类称为父类, 派生类称为子类, 这种子类对父类的关系就是继承
* 作用: 如果多个类中有共同的成员, 则可以将其抽取到同一个类中, 将这个类作为父类, 让其他类去继承, 继承后子类就具有了父类公开的成员
* 关键字: extends
* 定义位置: 子类类名后, 父类类名前
* 格式: `public class 子类类名 extends 父类类名 {}`
* Java语言中继承的特点
* 支持单继承, 多层继承
* 不支持多继承
* 注意: Java中所有类都直接或间接的继承Object类
* 继承关系下的成员
* 成员变量
* 子类可以获取父类的非私有成员变量
* 就近原则:
* 如果有局部变量, 则使用局部变量
* 如果没有局部变量, 有本类成员变量, 则使用本类成员变量
* 如果没有局部变量, 也没有本类成员变量, 则使用父类成员变量
* 如果都没有, 报错
* 成员方法
* 方法的重写: 在子父类继承关系中, 子类定义了和父类完全一样的方法(方法声明一样, 方法体无关), 子类就重写了父类的方法
* 注解: `@Override`
* 方法重写和重载的区别
* 定义位置不同
* 重写: 子父类关系中
* 重载: 同一个类中
* 方法定义不同
* 重写: 方法声明必须完全一样, 和方法体无关
* 重载: 方法名一样, 参数列表不同, 和返回值, 形参名称, 方法体无关
* 重写的特点:
* 子类如果重写了方法, 则调用子类重写的方法
* 子类如果没有重写父类方法, 则调用父类的方法
* 重写的应用场景
* 当父类方法无法满足子类需求时, 子类可以重写方法
* 注意事项
* 父类私有的方法不能重写
* 子类重写的方法权限必须大于等于父类方法的权限
* 构造方法
* 子类构造方法中默认会调用父类的空参构造
* this和super
* this
* `this(有参或无参)`: 可以调用本类其他构造方法
* `this.成员`: 使用当前对象的引用调用成员
* this在子类没有定义成员变量时, 会到父类中寻找父类的变量
* super
* `super(有参或无参)`: 可以调用父类的构造方法
* `super.成员`: 使用当前对象的父类引用调用父类的方法
* 特点:
* 只能在构造方法的第一行出现
* 两者只能调用其中一个
* 子类构造方法中至少有一个会调用父类的构造方法
* 执行顺序
* 创建子类对象时, 会先调用父类的构造方法
* 匿名对象
* 概念: 没有名字, 实际上是没有变量引用的对象
* 匿名对象调用成员
* `new 类名().成员变量`
* `new 类名().成员方法()`
* 使用场景: 适用于只需要使用对象一次的行为, 相当于一次性筷子
* final关键字
* 概念: 是一个修饰符, 能够修饰类, 方法, 变量
* 作用:
* 修饰类: 不能被继承
* 修饰方法: 不能被子类重写
* 修饰变量: 该变量是自定义常量, 一旦初始化则无法改变其值
* 抽象类
* 什么是抽象: 无法具体描述的, 但是能够表达出共性
* 关键字: abstract, 能够修饰类, 方法
* 作用:
* 抽象类
* 使用abstract修饰的类
* 含有抽象方法的类必须定义为抽象了你
* 抽象方法
* 没有方法体的方法: `修饰符 abstract 方法名();`
* 抽象方法必须被子类重写
* 抽象类和类的关系
* 抽象类也是类
* 一个类继承了抽象类后只有2种选择:
* 重写父类的抽象方法
* 将该类本身修改为抽象类
* 抽象类的特点:
* 抽象类和抽象方法必须用abstract修饰
* 抽象方法只能定义在抽象类中
* 抽象类中并不一定需要抽象方法, 抽象类中也可以有非抽象的方法
* 抽象类不能创建对象, 但是可以有构造方法(对成员进行初始化)
* 抽象类和类之间也存在继承关系
* 一个类继承了抽象类后只有2种选择:
* 重写父类的抽象方法
* 将该类本身修改为抽象类
* 抽象类成员的特点:
* 成员变量:
* 可以有成员变量
* 可以有常量
* 成员方法:
* 可以有抽象方法
* 可以有非抽象的方法
* 构造方法
* 可以有, 通过子类调用super()来实现抽象类成员的初始化
* abstract不能与final和private一起用
* final: 因为抽象方法必须被重写, 而final修饰的方法不能被重写, 有冲突
* private: 因为抽象方法必须被重写, 而private方法子类看不见, 所有有冲突
* 抽象思想的作用: 起到规范的作用 |