继承
继承的概念
类是对一批对象的抽象,继承是对一批类的抽象,使用关键字extends
classA extends classB
类和类之间的关系:
- 继承 is a
- 组合 has a
被继承的类称为父类,基类或者超类
继承的这个类称为子类或派生类
继承的特点
- 通过extends关键字,实现了继承之后,让类与类之间产生了关系,建立关系有好有坏,见下方继承优缺点
- 继承的本质就是抽取共性代码,多个重复代码的向上抽取,简化代码 BaseDao BaseActivity
- 类是对一批对象的抽象,继承是对一批类的抽象
- 父类又被称为超类,或者基类,子类又被称为派生类
- Java是面向对象语言,万事万物皆是对象,为了满足这个设计原则,所有的类都直接或者间接继承自Object类
继承的优缺点
继承的优点
- 简化了代码
- 提高了扩展性
- 提高了可维护性(対父类修改可实现所有子类全部修改)
- 开闭原则: 对扩展开放,对修改关闭
缺点
- 高内聚,低耦合: 类与类之间,功能与功能之间,模块与模块之间,功能尽量内聚,不同模块之间,尽量独立
- 造成耦合性过高,牵一发动全身
- 注意: 继承一定要慎用,主要利用继承简化代码的优点
继承的注意事项
- 单一继承性
- 支持多层继承
- 如果父类成员使用private修饰,那么子类不能被继承
- 如果一个子类继承了父类的属性和方法还可以有自己特有的属性和方法
- 当子类和父类的成员变量重名的时候,子类优先
- 构造方法不能够被继承
使用继承的情况:
- 一般在写代码的时候发现代码中存在重复代码,需要向上抽取,考虑继承
- 当某个类的设计非常复杂的时候可以考虑继承 例如: 设计一个窗口类
使用继承的步骤:
1. 先写子类
2. 观察多个子类是否存在共性代码
3. 如果存在,抽取共性代码到父类中
4. 子类继承父类
5. 将子类共性代码删除
6. 注意: 父类命名: A is a B
super关键字
this和super的区别:
this可以理解为当前对象,谁调用this就代指那个调用者对象,每次创建一个对象,默认都会创建一个this变量指向同一个堆区空间
super本质是父类存储空间的标识,但是你可以理解为父类对象,那么同样可以使用super这个关键字来访问父类的成员
访问成员
成员变量:
this.成员变量
super.成员变量
成员方法
this.成员方法
super.成员方法
构造方法
this(参数列表)
super(参数列表)
注意:
- 任何一个类的无参或者带参构造方法的第一句都默认省略 super();
- 任何一个类都直接或者间接继承自Object类
- 访问根类Object的无参构造方法在于加载Object类中静态成员和静态代码块
- 创建一个子类对象默认会去调用父类的构造方法,那么并没有创建父类对象,本质就相当于访问了一个普通方法,创建对象开启空间需要new关键字
- super访问父类带参构造方法的意义在于帮助子类初始化父类继承下来的成员,简化编程
- 静态环境/静态上下文(static修饰的方法),不能够出现this和super(因为京塔方法属于类变量在类加载时就调用了,此时还没有相应的对象)
- super必须出现在构造方法的第一句
- this和super不能够共存
方法重写
当父类的方法不能够满足子类的需求的时候,需要方法重写
方法重写的特点
- 发生在具有子父类的两个类中
- 方法名相同
- 参数列表完全相同
- 返回值类型可以相同或者是其子类
- 访问权限修饰符不能够严于父类
访问权限修饰符的宽严关系:
public > protected > default > private
- 抛出的异常不能够被扩大
注意事项
- private修饰的方法不能够被继承,所以不能够被重写
- 构造方法不能够被重写
- 子类重写父类的方法时,访问权限修饰符不能更低,严格
- 返回值类型相同或者是其子类
- 重载和重写的区别
封装
链接: 封装及访问控制符.