zoukankan      html  css  js  c++  java
  • 面向对象之多态---类型的转换与判断

    对象的向上转型

    格式: 父类名称 对象名 = new 子类名称();

    Animal animal = new Cat();

    创建了一只猫,当作动物来看待,没问题

    含义: 右键创建一个子类对象,把它当作父类来看待使用

    向上转型一定是安全的

    类似于 double num = 100; / / 正确

    // 抽象父类Animal
    public  abstract  class Animal {
        public abstract void eat();
    }
    
    
    // 子类Cat重写eat方法
    public class Cat extends Animal {
    
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
    
    
    // 向上转型一定是安全的,没有问题的,正确的,但是也有一个弊端
    // 对象一旦向上转型为父类,那么久无法调用子类原本特有的内容(子类特有方法)
    
    // 解决方案: 用对象的向下转型【还原】
    public class Main {
        public static void main(String[] args) {
    
            //对象的向上转型,就是,父类引用指向子类对象。
            Animal animal = new Cat();
            animal.eat();
        }
    }
    
    

    对象的向下转型

    对象的向下转型,其实就是一个【还原】的动作

    格式: 子类名称 对象名 = (子类名称) 父类对象;

    含义:将父类对象,[还原]成为本来的子类对象

    Animal animal = new Cat() // 本来是猫,向上转型成为动物

    Cat cat = (Cat) anmial // 本来是猫,已经被当做动物了,还原成为本来的猫

    Dog dog = (Dog) animal // 错误,因为对象创建的时候本来不是狗而是猫

    注意事项:

    1. 必须保证对象本来创建的时候,就是猫,才能向下转型成本来的猫

    2. 如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错(java.lang.ClassCastException 类转化异常)

    类似于: int num =(int) 10.0; // 可以 int num = (int) 10.5; //不可以,精度损失

    // Ctrl + O 快速重写父类方法
    // 这是Animal的另一个Dog子类
    public class Dog  extends  Animal{
        @Override
        public void eat() {
            System.out.println("狗吃Shit");
        }
        public void watchHouse(){
            System.out.println("狗看家");
        }
    }
    
    

    用instanceof关键字来进行类型判断

    /**
     * 如何才能知道一个父类引用的对象,本来是什么子类?
     *
     * 格式:
     *
     * 对象 instanseof 类名称
     *
     * 这将会得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。
     */
    public class Instanseof {
        public static void main(String[] args) {
            Animal animal = new Cat() ;//向上转型,本来是一只猫
            animal.eat(); // 猫吃鱼
    
            // 希望调用子类特有方法,需要向下转型
            // 判断一下父类引用animal本来是不是Dog
            if(animal instanceof Dog){
                Dog dog = (Dog) animal;
                dog.watchHouse();
            }
            if(animal instanceof Cat){
                Cat cat = (Cat) animal;
                cat.catchMouse();
            }
            System.out.println("=======");
            // 调用方法
            // 宠物猫方法
            giveMeAPetCat(new Cat());
            System.out.println("=======");
            // 宠物狗方法
            giveMeAPetDog(new Dog());
        }
        // 宠物猫
        public static void giveMeAPetCat(Animal animal){
            if(animal instanceof  Cat){
                Cat cat = (Cat) animal;
                cat.catchMouse();
            }
            if(animal instanceof  Dog){
                Dog dog = (Dog) animal;
                dog.watchHouse();
            }
        }
        // 宠物狗
        public static void giveMeAPetDog(Animal animal){
            if(animal instanceof Cat){
                Cat cat = (Cat) animal;
                cat.catchMouse();
            }
            if(animal instanceof Dog){
                Dog dog = (Dog) animal;
                dog.watchHouse();
            }
        }
    }
    
    
    
  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/fenixG/p/12960682.html
Copyright © 2011-2022 走看看