- 继承
- 什么是继承,继承可以解决代码复用,当多个类存在相同属性时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有子类不需要重新定义这些方法和属性,只需要通过extends来声明继承的父类。 示意图:
- 继承的作用
- 代码的复用性提高了
- 代码的可维护性和扩展性提高了
- 继承的十个细节
- 子类继承了所有的属性和方法,非私有的属性和方法可以直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
- 子类必须调用父类的构造器,完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不通过(所以有继承关系的时候一般都加上一个无参构造,防止出错)
- 指定调用父类的构造器,用super(参数列表)
- super在使用的时候只能出现在第一行,(super只能在构造器中使用)
- super()和this()都只能在构造器中的第一行,所以super()和this()不能存子啊同一个构造器中
- java中所有的类都是object 的子类,object 是所有类的基类
- 父类构造器的调用不限于直接父类,将一直往上追溯直到 Object 类(顶级父类)
- java是单继承机制,子类中只能继承一个父类(直接继承)
- 不能滥用继承,两个类必须要满足一定的关系才能够使用继承,比如(is a)Dog is a animal
- 继承的本质
-
- 继承原理结构图
- super 关键字
概念:代表父类的引用,用于访问父类的属性、方法、构造器
- 访问父类的属性和方法,但是不能直接访问父类的private属性和方法
- 访问父类的构造器,只能放在构造函数的第一行
- 调用父类构造器的好处,明确分工,父类属性由父类声明,子类属性由子类声明
- 当子类中有父类的属性和方法时,要访问父类的属性和方法必须通过super,
- super访问不限于直接父类,如果爷爷类与本类重名,也可以使用super去访问,如果有多个基类的方法和属性重名,按照继承原理结构图,就近原则
- super 和 this的比较
No. | 区别 | this | super |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果没有此属性,则从父类中继承查找 | 从父类开始查找属性 |
2 | 调用方法 | 访问本类中的方法,如果没有此方法,则从父类中继承查找 | 从父类开始查找方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须方法构造器首行 |
4 | 特殊 | 表示当前对象 | 子类中访问父类对象 |
- 方法重写/覆盖 钙奶:子类有一个方法,和父类的某个方法名、返回值类型、参数(个数、数据类型、顺序)一样,就说子类的这个方法重写/覆盖父类的方法,关键字(@Override)
- 重写的细节
- 子类的方法,形参列表,方法名,要和父类方法中的形参列表,方法名完全一样
- 子类的返回类型和父类的返回类型一样,或者是父类返回类型的子类,如父类返回类型Object ,子类返回类型是String
- 子类的方法不能缩小父类方法的访问权限 public > protected > 默认 > priate
- 多态
- 基本内容
- 概念:同类对象的同一种行为表现出来的不同形态 (父类型引用指向子类型对象)
- 多态机制
a. 编译的时候检查的是夫类型里面的属性和方法有没有,有,则不报错,正常执行没有则报错
b. 运行的时候绑定的是子类型对象空间,调用子类型对象中的属性和方法
- 为什么设计多态
a. 解决 封装的时候传的是什么数据类型,封装者不清楚 b. 体现差异化,同一类对象的同一种行为表现出来不同的形态
- 多态的向上转型(关键字:instanceof)
1.本质:父类的引用指向子类的对象
2. 语法: 父类类型 引用名 = new 子类类型
3. 特点a. 编译类型看左边 运行类型 看右边
b. 可以调用父类中的所有成员(遵循访问权限)
c. 不能调用子类中的特有成员
d. 最终运行效果看子类的具体实现
- 多态向下转型(编译不通过,可以理解强制类型转化,一定要进行强制类型转化,否则很有可能报错(classCastException))
- 语法: 子类类型 引用名 = (子类类型) 父类引用
- 特点
a. 只能强转父类的引用,不能强转父类的对象
b. 要求父类的引用必须指向的时当前目标类型对象
c. 当向下转型后,可以调用子类类型中所有成员
- 多态的好处:提高代码的拓展性、通透性,降低代码的耦合度
- 多态的应用 多态数组:数组定义类型为父类类型,里面保存的实际存储类型为子类类型(应用见java练习专题)
- 使用场景:同一类对象的同一种行为表现出来不同的形态,满足这一条件者均可以考虑使用多态