class Animal { public void move() { System.out.println("动物移动"); } } class Cat extends Animal{ @Override public void move() { System.out.println("猫在移动"); } // 子类对象特有的行为/动作 public void fun() { System.out.println("猫抓老鼠"); } } class Bird extends Animal { @Override public void move() { System.out.println("鸟在飞"); } public void fly() { System.out.println("Bird Fly"); } }
子类型-->父类型。又被称为自动类型转换。如:Animal a = new Cat();
父类型-->子类型。又被称为:强制类型转换。【需要加强制类型转换符】如:Cat c = (Cat)a;
什么时候必须向下转型:需要调用或者执行子类特有的方法。必须向下转型才可以调用。
向下转型存在风险,容易出现ClassCastException(类型转换异常)
可以在程序运行阶段动态的判断某个引用指向的对象是否为某一种类型。建议在向下转型时使用instanceof运行符进行判定。(具体内容在下面)
无论向下/向上转型,两种类型之间必须要有继承关系。没有继承关系,编译不通过。
Animal a = new Cat();//向上转型 a.move();
2.1、java程序永远都分为编译阶段和运行阶段。
2.2、先分析编译阶段,再分析运行阶段,编译无法通过,根本无法运行。
2.3、编译阶段编译器检查a这个引用的数据类型为Animal,由于Animal.class字节码当中有move()方法,所以编译通过了。这个过程称为静态绑定,编译阶段绑定。只有静态绑定成功之后才有后续的运行。
2.4、在程序运行阶段,JVM堆内存当中创建的对象是Cat对象,那么a.move();在运行阶段一定会调用Cat对象的move()方法,此时发生了程序的动态绑定,运行阶段绑定。
2.5、无论是Cat类有没有重写move方法,运行阶段一定调用的是Cat对象的move方法,因为底层真实对象就是Cat对象。
2.6、父类型引用指向子类型对象这种机制导致程序在编译阶段绑定和运行阶段绑定两种不同的形态/状态,这种机制可以成为一种多态语法机制。
Animal a = new Cat(); a.fun();//此行报错
此行代码报错原因:
因为编译阶段编译器检查到a的类型是Animal类型,从Animal.class字节码文件当中查找fun()方法,最终没有找到该方法,导致静态绑定失败,没有绑定成功,编译失败。
a是无法直接调用的,因为a的类型Animal,Animal中没有fun()方法。这时需要将a强制类型转换为Cat类型。
a的类型是Animal(父类),转换成Cat类型(子类),被称为向下转型。
Cat a2 = (Cat)a;
a2.fun();
Animal a3 = new Bird(); Cat c3 = (Cat)a3;//向下转型
1.以上代码编译没有问题,因为编译器检查到a3的数据类型是Animal,Animal和Cat之间存在继承关系,并且Animal是父类型,Cat是子类型,父类型转换成子类型叫做向下转型,语法没有问题。
2.程序虽然编译通过了,但是程序在运行阶段会出现异常,因为JVM堆内存当中真实存在的对象是Bird类型,Bird对象无法转换成Cat对象,因为两种类型之间不存在继承关系,出现异常java.lang.ClassCastException,类型转换异常,这种异常总是在“向下转型的时候”会发生。
2.1语法格式:(引用 instanceof 数据类型名 )
2.2以上运算符的执行结果类型是boolean类型。
2.3关于结果true/false
假设:(a instanceof Animal)
true表示:a这个引用指向的对象是一个Animal类型;
false表示:a这个引用指向的对象不是一个Animal类型。
Animal a3 = new Bird(); if(a3 instanceof Cat) { Cat c3 = (Cat)a3; c3.fun(); }else if(a3 instanceof Bird) { Bird b2 = (Bird)a3; b2.fly(); }
降低程序的耦合度,提高程序的扩展力。
降低程序的耦合度【解耦合】,提高程序的扩展力。
提倡面向抽象编程,不要面向具体编程。
下一篇:持续更新中
原文:https://www.cnblogs.com/arick/p/13702045.html