一, 多态的语法
1. 关于多态中涉及到几个概念
(1) 向上转型 (upcasting)
子类型转换为父类型, 又被称为自动类型转换
(2) 向下转型 (downcasting)
父类型转换为子类型, 又被称为强制类型转换 (需要加强制类型转换符)
(3) 无论是向上转型还是向下转型, 它们之间都必须有继承关系, 否则编译是不通过的.
(4)Java 中允许语法: 子类型向父类型及逆行转化
2. 过程:
(1)java 程序分为编译和运行阶段
(2) 先分析编译阶段, 再分析运行阶段, 编译无法通过, 根本是无法运行的;
(3) 编译阶段检查 a2 这个引用的数据类型为 Animal46, 由于 Animal.class 字节码中有 move() 方法, 所以编译通过了, 这个过程我 i 们称为静态绑定, 编译阶段绑定, 只有静态绑定成功后才会有后续的运行.
(4) 程序运行阶段, JVM 堆内存中真实创建的对象是 Cat 对象, 那么以下程序在运行阶段一定会调用 Cat 对象的 move() 方法, 此时发生了程序的静态绑定. 运行阶段绑定.
(5) 无论是 Catc46 类有没有重写 move 方法, 运行阶段一定会调用的是 Cat 对象的 move 方法, 因为底层真实的对象就是 Cat 对象.
(6) 父类型引用指向子类型对象这种机制导致了存在编译阶段绑定和运行阶段绑定两种不同的形态 / 状态, 这种机制可以成为一种多态语法机制.
- package com.bjpowernode.java_learning;
- ?
- public class D46_1_polymorphic {
- public static void main(String[] args) {
- // 下面使用多态语法机制
- Animal46 a2 = new Cat46();// 一个 Animal46 类型的引用指向了 Cat46 对象
- a2.move();// 底层是 Cat46 对象, 如果这个方法没重写, 那么就会调用 Animal 的原始 move 方法
- //a2.catchMouse();// 分析这行程序为什么不能调用?
- // 因为编译阶段编译器检查 a2 的类型是 Animal 类型, 从 Animal.class 字节码文件之中查找 catchMouse
- // 方法, 最终没有找到该方法, 导致静态绑定失败, 没有绑定成功, 也就是编译失败, 更别谈运行了.
- /**
- * Animal 和 Cat 之间存在继承关系, Animal 是父类, Cat 是子类
- * Cat 是 Animal 合理的
- * new Cat() 创建的对象类型是 Cat,a2 这个引用的数据类型是 Animal, 可见它们进行了类型转换
- * 子类型转换为父类型, 称为向上转型.
- */
- }
- }
- ?
- class Animal46{
- public void move() {
- System.out.println("动物们再行走");
- }
- }
- class Cat46 extends Animal46{
- public void move() {
- System.out.println("小猫在行走");
- }// 重写函数
- // 下面是小猫类特有的函数
- public void catchMouse() {
- System.out.println("小猫是会抓老鼠的");
- }
- }
- class Bird46 extends Animal46{
- public void move() {
- System.out.println("小鸟在飞翔");
- }
- }
- ?
二, 源码:
D46_1_polymorphic.java
地址:
- https://github.com/ruigege66/Java/blob/master/D46_1_polymorphic.java?
- 2.CSDN:https://blog.csdn.net/weixin_44630050(心悦君兮君不知 - 睿)
3. 博客园: https://www.cnblogs.com/ruigege0000/
来源: http://www.bubuko.com/infodetail-3264634.html