Java 多态(动态绑定)

Java 三大特性之一。

多态(动态绑定、后期绑定)是 Java 三大特性(继承/封装/多态)之一。在学习多态之前,需要先了解一下静态绑定。为了统一,以下多态均用动态绑定表示。

绑定

一个方法的调用与这个方法的类连接在一起的过程被称为绑定。

静态绑定(前期绑定、编译时绑定)

静态绑定是指在程序运行前方法就已经被绑定。即在编译时就已经知道了每个方法的参数类型以及每个方法应属于哪个类。对于 Java 而言,Java 中的方法只有 final ,static,private 和构造方法是前期绑定的,这些方法都显式地属于一个具体的类,在之后的运行过程中绑定关系不会发生变化。

动态绑定(后期绑定、运行时绑定、多态)

动态绑定是指在运行时根据具体对象的类型进行绑定。动态绑定有三个必要条件:

  1. 要有继承关系;
  2. 子类要重写父类的方法;
  3. 父类引用指向子类对象。

对于以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Test {
public static void main(String[] args){
Father son = new Son();
System.out.println(son.age);
son.message();
}
}
class Father {
public int age = 50;
public void message() {
System.out.println("Father");
}
}
class Son extends Father {
public int age = 25;
public void message() {
System.out.println("Son");
}
}
/*
output:
50
Son
*/

在上述例子中, son 是一个 Father 的对象,但是指向了 Son 的引用,这种概念即称为多态(动态绑定)。对于son 来讲,他的变量(如 age )是 Father 的成员变量,因为多态只针对于方法。由于 Son 重写了 Message() 方法,因此在调用该方法时将会调用 Son 中的方法。

以下是对于多态解释更清晰的代码:

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
public class Test {
public static void main(String[] args) {
Father son = new Son1();
son.message();
son = new Son2();
son.message();
}
}
class Father {
public int age = 50;
public void message() {
System.out.println("Father");
}
}
class Son1 extends Father {
public int age = 25;
public void message() {
System.out.println("Son1");
}
}
class Son2 extends Father {
public int age = 20;
public void message() {
System.out.println("Son2");
}
}
/*
output:
Son1
Son2
*/

这个例子就清晰的说明了什么叫多态(动态绑定),Father 对象可以有 Son1、Son2 两种引用(父类可引用任意一个字类)。

参考:Java静态绑定与动态绑定

感谢您的支持
-------------本文结束感谢您的阅读-------------