package DuoTai02;
/**
* 关于java语言中的多态语法机制:
* 1.Animal cat Bird三个类之吉间
* cat继承Animai 有父子关系
* Bird继承Animai 有父子关系
* cat bird没有任何关系
*
* 2. 面向对象三大特征:封装 继承 多态
* *向上转型(upcasting)
* 子类型-->父类型
* 自动类型转换.
*
* *向下转型(downcasting)
* 父类型-->子类型
* 强制类型转换.需要加强制类型转换符
*
* *重点:无论是向上转型还是向下转型,两个类型之间必须有继承关系.
* 没有继承关系,程序是无法编译通过的.
*
* */
public class Testday {
public static void main(String[] args) {
Animai a1 = new Animai() ;
a1.move();
cat c1 = new cat();
c1.move();
Birde b = new Birde();
b.move();
//多态语法机制
/**
* 1.java程序永远都分为编译阶段和运行阶段.
*
* 2.先分析编译阶段,在分析运行阶段,编译无法通过,根本是无法运行的.
*
* 3.编译阶段编译器检查a2这个引用的数据是Animai的,由于Animai.class
* 字节码当中有move()方法,所以编译通过了.这个过程我们成为静态绑定,编译阶段
* 绑定,只有静态绑定成功之后才有后续运行.
*
* 4.在程序运行阶段,JVM推内存当中真实创建的对象是cat对象,那么以下程序运行阶段
* 一定会调用cat对象的move()方法,此时发生了程序的动态绑定,运行阶段绑定.
*
* 5.父类型引用指向子类型对象这种机制导致程序存在编译阶段绑定和运行绑定两种不同的形态/状态
* 这种机制可以成为一种多态语法机制.
* */
//父类型引用指向子类型对象.
Animai a2 = new Birde();
a2.move();
//a2.catchMouse();编译报错:因为a2的类型Animai,Animai中没有catchMouse()方法.
// Birde b2 = new cat();//编译报错:因为两者之间不存在继承关系
/**
* 需求:
* 假设想让以上的对象执行catchMouse()方法,怎么办?
* a2的类型是Aniami(父类),转换成cat类型(子类)
*
* 重点:向下转型也需要两种类型之间必须有继承关系.不然编译报错.强制类型转换需要强制类型转换符
*
* 什么时候需要使用向下转型呢?
* 当调用的方法是子类特有的,父类中不存在的,必须要进行向下转换的
*
* */
Animai a3 = new Birde();
/**
* 1. 以下程序编译没有问题,因为编译器检查到a3的数据类型是Animai
* Animai和cat之间存在继承关系,兵器Aniami是父类型,cat是子类型,
* 夫类型转成子类型叫做向下转型,语法和各.
*
* 2.但是程序在运行阶段出现异常,因为JVM堆内存
* 当中真实存在的对象是Bird类型,Bird对象无法转成cat对象,因为两种
* 类型之间不存在任何关系,此时出现了著名的
* 异常:java.lang.ClassCastException
*
* 类型转换异常,往往出现在"向下转换的时候"会发生
* */
/**
* 1.以下异常只有在强制类型转换的时候会发生,也就是说"向下转型"存在隐患
* 2.怎么避免向下转型出现的:java.lang.ClassCastException呢?
* 使用instanceof运算符可以避免出现以上的异常.
*
* 3instanceof运算符怎么用?
*
*
*
*
*
* */
if(a3 instanceof cat) {
cat c3 = (cat)a3;
c3.catchMouse();
}else if (a3 instanceof Birde) {
Birde b2 = (Birde)a3;
b2.fly();
}
}
}
关于java中 "多态" 特征的认识
最新推荐文章于 2022-07-28 17:58:23 发布