学习笔记-基础12-多态
关键词:Java的三大特征之一、多态、向上转型、向下转型
测试代码:
1 // Animal.java 2 3 public class Animal{ 4 void move(){ 5 System.out.println("动物可以移动!"); 6 } 7 }
1 // Bird.java 2 public class Bird extends Animal{ 3 void move(){ 4 System.out.println("鸟儿可以飞翔!"); 5 } 6 void catchInsect(){ 7 System.out.println("鸟儿抓虫子!"); 8 } 9 }
1 // Cat.java 2 public class Cat extends Animal{ 3 void move(){ 4 System.out.println("猫可以走猫步!"); 5 } 6 7 void catchMouse(){ 8 System.out.println("猫抓老鼠!"); 9 } 10 }
1 // Test.java 2 public class Test{ 3 public static void main(String[] args){ 4 Animal animal = new Animal(); 5 animal.move(); 6 Cat cat = new Cat(); 7 cat.move(); 8 Bird bird = new Bird(); 9 bird.move(); 10 /* 11 上面三行输出为: 12 动物可以移动! 13 猫可以走猫步! 14 鸟儿可以飞翔! 15 */ 16 System.out.println("----"); 17 18 /* 19 new Cat()创建的对象的类型是cat2, a2这个引用的数据类型是Animal,可见它们进行了类型转换子类型转换成父类型,称为向上转型/upcasting/自动类型转换 20 */ 21 Animal a2 = new Cat(); //这里是父类引用指向子类对象 22 a2.move(); //输出:猫可以走猫步! 23 24 //Bird a3 = new Cat(); //这条语句编译错误,因为Bird和Cat不存在继承关系 25 26 //a2.catchMouse(); //这条语句编译错误,因为a2的数据类型是Animal,Animal中不存在该方法 27 //我们可以将a2强制类型转换为Cat类型 28 29 Cat c2 = (Cat) a2; //a2的类型是Animal(父类),转换成Cat类型(子类),被称为向下转型/ downcastingr/强制类型转换。 30 31 c2.catchMouse(); //输出:猫抓老鼠! 32 33 System.out.println("----"); 34 35 Animal a3 = new Bird(); 36 /* 37 1、以下程序编译是没有问题的,因为编译器检查到a3的数据类型是AninalAnimal和cat之间存在继承关系, 38 并且Animal是父类型, cat是子类型,父类型转换成子类型叫做向下转型,语法合格。 39 2、程序虽然编译通过了,但是程序在运行阶段会出现异常,因为JVM堆内存当中真实存在的对象是Bircd类型, 40 Bird对象无法转换成cat对象,因为两种类型之间不存在任何继承关系,此时出现了著名的异常: 41 java.lang.classCastException 42 类型转换异常,这种异常总是在向下转型”的时候会发生。 43 3、 使用instanceof运算符可以避免以上异常 44 */ 45 //Cat c3 = (Cat) a3; //这里编译通过,但实际运行会报错 46 if(a3 instanceof Cat){ 47 Cat c3 = (Cat) a3; 48 c3.catchMouse(); 49 }else if(a3 instanceof Bird){ 50 Bird b3 = (Bird) a3; 51 b3.catchInsect(); 52 } 53 54 } 55 }


浙公网安备 33010602011771号