super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。
也就是说不管怎么都会调用super();这是编译器帮我们加上去的
5.3.1 继承树追溯
- 属性/方法查找顺序:(比如:查找变量h)
- 查找当前类中有没有属性h
- 依次上溯每个父类,查看每个父类中是否有h,直到Object
- 如果没找到,则出现编译错误。
- 上面步骤,只要找到h变量,则这个过程终止。
- 构造方法调用顺序:
构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复。
1 | public class TestSuper02 { |
1 | 开始创建一个ChildClass对象...... |
5.6 多态
多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,高淇老师是敲代码,数学教授是做数学题; 同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。
多态的要点:
1. 多态是方法的多态,不是属性的多态(多态与属性无关)
2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象
3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了
再来看一段代码:
1 | /** |
之前一直死记的编译看左边,运行看右边,现在看来很好理解了,因为当前编译器是将你的对象当作你定义的对象(父类)来看的,但是其实你是子类。