学习笔记-基础12-多态

关键词:Java的三大特征之一、多态、向上转型、向下转型

测试代码:

1 // Animal.java
2 
3 public class Animal{
4     void move(){
5         System.out.println("动物可以移动!");
6     }
7 }
Animal.java(父类)
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 }
Bird.java(子类)
 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 }
Cat.java(子类)
 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 }
Test.java(测试类)

 

posted @ 2022-08-20 16:18  FREAM  阅读(7)  评论(0)    收藏  举报