zoukankan      html  css  js  c++  java
  • JAVA多态学习2

    好啦,这里紧接着上次没说的向下转型,请读者结合上次讨论的向上转型的样例一起探讨(事实上本次代码也有加上,放心)。

    我们这里希望从向下转型会出现的两种基本情况进行探讨

    package downcasting;
    
    
    //动物类Animal父类
    class Animal{
        String name;
        int age;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        //动物会叫
        public void cry(){
            System.out.println("不知道怎么叫");
        }
        //动物吃东西
        public void eat(){
            System.out.println("不知道吃什么");
        }
    }
    //创建Dog子类并extends继承Animal父类及覆盖cry方法
    class Dog extends Animal{
        //狗叫
        public void cry(){                         //覆盖父类方法
            System.out.println("汪汪叫");
        }
        //狗吃东西
        public void eat(){                          //覆盖父类方法
            System.out.println("狗爱吃骨头");        
        }
        public void bite(){
    
            System.out.println("狗会咬人...");
        }
    }
    
    public class Downcasting {
    
        public static void main(String[] args) {
            // TODO 自己主动生成的方法存根
    
               Animal g1=new Dog();  //向上转型
               g1.cry();
               g1.eat();
               /*
                * 情况一:假设父类引用的对象假设引用的是指向的子类对象,
                * 那么在向下转型的过程中是安全的。也就是编译执行是不会出错误的
                */
               Dog dog=(Dog)g1;         //向下转型,编译和执行皆不会出错
               dog.cry();
    
               dog.eat();
    
               Animal g2=new Animal();
    
               /*
                *情况二:假设父类引用的对象是父类本身,那么在向下转型的过程中是不安全的。
                *编译不会出错,可是执行时会出现java.lang.ClassCastException错误。
                *它能够使用instanceof来避免出错此类错误。
                * */
    
             /*
              *错误例如以下: Exception in thread "main" java.lang.ClassCastException:
              *         downchange.Animal cannot be cast to downchange.Dog
                        at downchange.Downchange.main(Downchange.java:62)
    
    
               Dog dog1=(Dog)g2;
               dog1.cry();
               dog1.eat();
    
               */
    
    
               if(g2 instanceof Dog){
    
                        Dog dog1=(Dog)g2;
                        dog1.cry();
                        dog1.eat();
               }
               else if(g2 instanceof Animal){
                   System.out.println("g2是Animal的实例");}
    
               //Dog g3=new Animal();   //不存在从Animal转换到Dog
        }
    
    }
    

    向下转型

    ps:
    instanceof:
    1.用instanceof来測试它所指向的对象是否是某个类。
    2.instanceof在对象类型的强制转换,先推断是否是某种类型,是的话再强制转换成改类型。

  • 相关阅读:
    nginx-syslog
    loki
    idea安装中文插件
    nginx虚拟目录alias
    个人 软件系统整理
    Python 遍历Sheet 每个Sheet都单独保存为一个Excel
    SQL Server 多表关联的update语句
    电商 生意参谋 抓取 访客数据 JS版/谷歌插件版
    EF 多表关联
    个人 圈外同学 对比分析
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7100737.html
Copyright © 2011-2022 走看看