继承
为什么要用继承
降低代码的复用性
继承的基本介绍和示意图
继承可以解决代复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性和方法时 可以从这些类中抽象出父类 在父类中定义这些相同的属性和方法 所有的子类不需要重新定义这些属性和方法,只需要通过extends来声明继承父类即可
继承的基本语法
class 子类 extends 父类{}
子类会自动的又有父类定义的属性和方法
子类又叫做超累 基类
子类又叫派生类
继承的示意图
继承的注意细节
-
提高代码的复用性
-
代码的扩展性和维护性提高了
注意细节
1、子类继承了所有的属性和方法 但是私有属性不能再子类直接访问 要通过父类提供的公共的方法去访问 2、非私有的属性和方法可以直接访问 3、子类必须调用父类的构造器 完成父类的初始化 4、当创建子类对象是,不管使用子类的那个构造器 默认情况下总会去调用父类的无参构造器, 如果父类没有提供无参构造器 则必须再子类的构造器中用super去指定使用父类的那个构造器完成对父类的初始化工作 否则编译不会通过 5、 如果希望指定去调用父类的某个构造器 则必须显示表示出来 6、super在使用时,必须放在第一行 7、 super和this都必须放在第一行 因此两个方法不能共存在一个构造器 8、java所有类都是Object的子类,Object时所有类的基类 9、父类构造器的调用不限于直接父类 将一直往上追溯到object类(顶级父类) 10、子类最多只能继承一个父类(直接继承)即java时单继承机制 11、不能滥用继承关系 子类和父类之间必须满足is-a的逻辑关系(是一个什么什么的)
继承的本质
内存图
System.out.println(son.name)//按照查找关系来返回信息
/*
1.首先看子类是否有该属性
2.如果子类有这个属性并且可以访问 则返回信息
3.如果子类没有这个属性 就看父类有没有这个属性
4.如果父类没有就按照上述规则继续寻上级父类直到Object类
*/
注意点
访问父类如果是私有的变量 仍然可以访问到 但是无法直接调用 需要通过个public 的方法来调用。不会跳过父类去找爷类
继承相关习题
继承的基本思想:父类的构造器完成父类属性的初始化,子类的构造器完成子类的初始化
super关键字
基本介绍
super代表父类的引用,用于访问父类的属性 方法 构造器
基本语法
- 访问父类的属性 但不能访问父类的private属性 super.属性名
- 访问父类的方法,不能访问父类的private方法 super.方法名(参数列表)不会查询本类直接去父类中查找
- 访问父类的构造器 super(参数列表) 只能访问构造器的第一句 只能出现一句
优点
- 调用父类构造器的好处(分工明确 父类属性由父类初始化 子类的属性由子类初始化)
- 当子类中由和父类中的成员(属性和方法)重名时,为了访问父类的成员 必须通过super。
- 如果没有重名 使用super this 直接访问是一样效果
直接访问和this.查找的规则是:
/*
1、先找本类 如果有 则调出
2、如果没有则找父类
3、如果父类没有则继续找父类的父类 直到object
*/
4、super 的访问不限于直接父类 如果爷爷类和本类有同名的成员 也可以使用super去访问爷爷类的成员;如果多个基类中都有同名的成员,使用super访问遵循就近原则 A->B->C ,当然也需要遵循权限原则