Java SE笔记: 上下转型和多态

  • 静态绑定:程序在本类和父类中查找匹配的方法执行
  • 动态绑定:程序根据引用指向的堆中数据查找最合适的方法执行,如找不到再返回父类中查找

关于java语言中向上转型和向下转型

1.向上转型(upcasting) : 子—>父
2.向下转型(downcasting) : 父—>子

注意: 无论是向上转型还是向下转型,两个类之间必须要有继承关系。

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
44
45
46
47
48
49
public class Test02 {
public static void main(String[] args) {
//向上转型又被称作:自动类型转换.
//父类型的引用指向子类型对象.
//程序分两个阶段:编译阶段,运行阶段。
//程序编译阶段只知道a1是一个Animal类型。
//程序在运行的时候堆中的实际对象是Cat类型。
Animal a1 = new Cat();

//程序在编译阶段a1被编译器看做Animal类型.
//所以程序在编译阶段a1引用绑定的是Animal类中的eat方法.(静态绑定)
//程序在运行的时候堆中的对象实际上是Cat类型,而Cat已经重写了eat方法。
//所以程序在运行阶段对象的绑定的方法是Cat中的eat方法.(动态绑定)
a1.eat(); //猫吃鱼

//向下转型:强制类型转换
Animal a2 = new Cat(); //向上转型.

//要执行move方法,怎么做?
//只能强制类型转换,需要加强制类型转换符
Cat c1 = (Cat)a2;

c1.move();

//判断以下程序运行的时候会出什么问题?
//Animal a3 = new Dog(); //向上转型.

//强制类型转换
//Cat c2 = (Cat)a3; // java.lang.ClassCastException

//在做强制类型转换的时候程序是存在风险的!
//为了避免ClassCastException的发生,java引入了 instanceof
/*
用法:
1. instanceof运算符的运算结果是 boolean类型
2. (引用 instanceof 类型) --> true/false

例如:(a instanceof Cat) 如果结果是true表示:a引用指向堆中的java对象是Cat类型.
*/
Animal a3 = new Dog();

System.out.println(a3 instanceof Cat); //false

//推荐:在做向下转型的时候要使用instanceof运算符判断,避免ClassCastException
if(a3 instanceof Cat) {
Cat c2 = (Cat)a3;
}
}
}

多态

其实就是多种状态,overload (重载)是多态的一种,属于编译期绑定,也就是静态绑定(前期绑定) ,override 是运行期间绑定(后期绑定) 。
多态存在的条件:

  • 有继承
  • 有覆盖
  • 父类指向子类的引用
文章目录
  1. 1. 关于java语言中向上转型和向下转型
  2. 2. 多态