1.super.和父类对象沟通的桥梁
- 使用super可以调用父类的方法和属性(满足访问控制符的控制)
- super是子类和父类的桥梁,但是并不是父类的引用
- 所有super和this自引用不一样,不是简单的模拟
- 使用super可以调用父类的public属性,但是super不是一个引用
- super的用法就像是一个父类的引用,但不是全部
- 可以认为,创建子类对象的时候,同时创建了一个隐藏的父类对象
- 所以才可以使用setName,对name属性进行操作
2.调用父类的构造方法
- 使用super调用父类的构造方法必须是子类构造方法的第一个语句
- super里面可以用表达式
- super调用构造方法不可以使用super访问父类的属性和构造方法
- 可以使用过静态变量和方法
- 都是
方法
3.父类和子类的引用赋值关系
可以用子类的引用给父类的引用赋值,也就是说父类的引用可以指向子类的对象
反之则不行,因为父类没有子类的属性和方法
- 因为子类继承了父类的方法和属性,所以父类的对象能做到的,子类的对象也能
- 换句话说我们可以在子类的对象上执行父类的方法
- 当父类的引用指向子类的实例,只能像父类一样操作子类的对象
- 也就是说 名 的类型,决定了能执行哪些操作
如果确定一个商品的引用是指向Phone则可以使用强制转化类型
4.多态:到底调用哪个方法上
- 可以调用那些方法,取决于引用的类型,具体调用哪个方法却决于实例所属的类
- 虽然用的是父类的引用指向不同类型的对象,调用getName方法时,实际指向的的方法却决于对象的类型,而非引用的类型
- 所以说能调用那些方法是引用调用决定的,具体执行哪个方法是指向的对象决定的
- 这就是覆盖的精髓,覆盖是多态的一种,是最重要的一种
- 之前我们使用子类的引用指向子类的对象,调用子类里的覆盖父类的方法,实际执行的是子类的方法
- 现在,我们用父类的引用指向子类的对象,调用被子类覆盖的方法实际执行还是子类方法
- 只要能够指向,就说明这个对象肯定是这个类型或者其子类的一个实例,否则会出现异常
5.多态:到底调用哪个方法下
- 无论一个方法是使用哪个引用被调用,它都是在实际的对象上执行,执行的任何一个方法,都是这个对象所属的类的方法
- 如果没有就会去父类中找,再没有,就去父类的父类找,依次寻找
- 我们一直说子类里有一个特殊的父类对象,这时候,这个特殊的父类对象里的this自引用,就是子类的引用
- 那么顺其自然,再继承自父类的代码中去调用一个方法,也是从子类开始,一层层寻找
- 这也是java使用单继承的原因
6.多态里的更多语法点
- 重载:静态多态,调用的方法和参数实际指向的对象无关,只和引用本身的类型相关
- 因为调用时参数类型是确定的,所以再编译期间就可以明确知道哪个方法会被调用如果又多种可能则会有编译错误
- 如果没有类型完全匹配的候选,会根据类型的继承关系向下寻找找到最贴近的哪个方法
- 静态方法也是一样的,重载寻找方法的顺序是一样的
7.多态里的更多的语法点
- 程序的执行就是找到要执行的代码,并且知道执行的代码能访问到那些数据,数据从哪里来
- 多态的核心问题就是:要调用哪个方法,这个方法用到的数据是谁
8.instanceof
- instanceof操作符,可以判断一个引用指向的 对象是否是某一个类型或其子类
- 是则返回true,否则返回false
- 先判断再强制类型转换比较安全
- 如果引用为null,则肯定会返回false
9.继承专属的访问控制符:protected
- protected可见性 = default + 对子类可见
- 子类覆盖父类的方法可以,但是不能让 可见性降低
- 当我们用一个父类的引用指向子类的方法时
- 如果子类的方法 改为了 private,调用的时候就无法访问到方法