Oct 17, 2023
关于多态(1)
前提:继承(实现)、覆盖(override)、向上转型。
目的:通过允许向上转型,实现动态绑定,在”不变“中实现“变化”。
原则:开闭原则。
实现:使用基类的引用或者指针,引用或者指向子类对象。这些不同的子类实现了一些基类中相同的方法,但各有自己的不同操作,在进行这些相同操作时,系统会根据实际引用和指向的对象,确定需要调用哪一个子类对象的那一个共同方法。
影响:实现了静态语言的动态绑定,解决参数传递只能传递指定类型的局限性,有利于实现开闭原则。
注意:在向上转型后,该引用不能调用子类对象独有的方法。解决方法:强制类型转换,不安全。
技术:虚函数指针,虚函数表,虚函数切片。
示例:C++,Java,Python的多态实现,Java的interface与abstract类的区别。
- Java
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
43//(1)抽象类举例
//抽象类:不能被实例化
/*与接口的区别:包含了该类别常用的方法属性,包含已经实现的方法,不过因为其是抽象的,所以规定不能实例化。
*方法相当于接口中的接口方法.
*c++: 跟c++同时含有虚函数跟纯虚函数类似
*/
public abstract class Creature {
//吃东西
public void eat() {
System.out.println("Creature: eating...");
}
//接口
public abstract void think();
}
public class human extends Creature{
public void think() {
System.out.println("Human is thinking !");
}
}
//测试类
public class Test {
public void testCreature(Creature c) {
c.eat();
c.think();
}
//测试
public static void main(String[] args) {
Test test =new Test();
Human human = new Human();
test.testCreature(human);
}
}
1 | //接口举例(3) |