Fork me on GitHub

十四.继承的实现

super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。

image

使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。

若是构造方法的第一行代码没有显式的调用super(…)或者this(…);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。

也就是说不管怎么都会调用super();这是编译器帮我们加上去的

image

5.3.1 继承树追溯

  • 属性/方法查找顺序:(比如:查找变量h)
  1. 查找当前类中有没有属性h
  2. 依次上溯每个父类,查看每个父类中是否有h,直到Object
  3. 如果没找到,则出现编译错误。
  4. 上面步骤,只要找到h变量,则这个过程终止。
  • 构造方法调用顺序:
    构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。
    注:静态初始化块调用顺序,与构造方法调用顺序一样,不再重复。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestSuper02 { 
public static void main(String[] args) {
System.out.println("开始创建一个ChildClass对象......");
new ChildClass();
}
}
class FatherClass {
public FatherClass() {
System.out.println("创建FatherClass");
}
}
class ChildClass extends FatherClass {
public ChildClass() {
System.out.println("创建ChildClass");
}
}
1
2
3
开始创建一个ChildClass对象......
创建FatherClass
创建ChildClass

5.6 多态

多态指的是同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同。 比如:同样是调用人的“休息”方法,张三是睡觉,李四是旅游,高淇老师是敲代码,数学教授是做数学题; 同样是调用人“吃饭”的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。


多态的要点:

1. 多态是方法的多态,不是属性的多态(多态与属性无关)

2. 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象

3. 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了

image

image

再来看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* @author RickYinPeng
* @ClassName Test_04_多态
* @Description
* @date 2018/11/20/18:57
*/
public class Test_04_多态 {
public static void main(String[] args) {
Animal a = new Animal();
animalCry(a);

Dog d = new Dog();
animalCry(d);

animalCry(new Cat());

Animal b = new Cat();
b.shout();

}
static void animalCry(Animal a){
a.shout();
}
}
class Animal {
public void shout() {
System.out.println("叫了一声!");
}
}
class Dog extends Animal {
public void shout() {
System.out.println("旺旺旺!");
}
public void seeDoor() {
System.out.println("看门中....");
}
}
class Cat extends Animal {
public void shout() {
System.out.println("喵喵喵喵!");
}
}

image

之前一直死记的编译看左边,运行看右边,现在看来很好理解了,因为当前编译器是将你的对象当作你定义的对象(父类)来看的,但是其实你是子类。