• Java中的多态,引用类型的转换


    1.多态分为引用多态和方法多态,见测试类

        package com.wangcf;
        //父类
        public class Animal {
            public void eat(){
                System.out.println("父类的方法");
            }
        }
    package com.wangcf;
    //子类
    public class Bridge extends Animal{
    
        public void eat(){
            System.out.println("子类鸟重写的方法");
        }
        
        public void fly(){
            System.out.println("子类鸟独有的可以飞的方法父类中没有");
        }
    }
    package com.wangcf;
    //子类
    public class Tiger extends Animal{
        
    }
    package com.wangcf;
    //测试类
    public class Test {
        public static void main(String[] args) {
            //1.引用多态
            Animal obj1=new Animal();    //父类的引用可以指向本类的对象
            Animal obj2=new Bridge();    //父类的引用可以指向子类的对象
            Animal obj3=new Tiger();
            Tiger obj4=new Tiger();
            //Bridg obj3=new Animal();    子类引用不可以指向父类
            
            //2.方法多态    优先使用子类的方法,若子类没有重写,则使用父类的方法;父类引用不可以调用子类独有的方法
            obj1.eat();    //创建父类的本类对象,调用方法时,调用的是本类的方法
            obj2.eat();    //若父类指向子类对象,调用方法为子类的重写方法
            obj3.eat();    //或者继承方法
            obj4.eat();    //若创建子类的本类对象,没有重写父类的方法,则会调用父类的方法
            //obj2.fly();    不能通过父类的引用调用子类独有的方法
            
            
        }
    }

     2.引用类型的转换

    (1)向上转型,小类型转换为大类型,它是隐式的,自动的,不存在隐患

    (2)向下转型,大类型转换为小类型,它是强制转换,存在隐患,会参数内存溢出;可以使用instanceof运算符类避免安全性问题

    package com.wangcf;
    //测试类
    public class Test {
        public static void main(String[] args) {
            Bridge bri=new Bridge();
            Animal animal=bri;//向上转型
            
            //Bridge bri2=animal;向下转型,错误需要使用强制转换
            Bridge bri1=(Bridge)animal;//强制
            
            //Tiger tig=(Tiger)animal;//虽然编译器没有报错,运行时会错,我们知道animal是Briger转换来的,它不能转换为Tiger
            //Tiger tiger=(Tiger)bri;    //Cannot cast from Bridge to Tiger
            //使用 instanceof 进行判断
            if(animal instanceof Tiger){
                Tiger tig1=(Tiger)animal;
            }else{
                System.out.println("无法进行类型转换");
            }
        }
    }
  • 相关阅读:
    MySQL与SQLServer的语法区别
    Linux系统ELK环境搭建
    springboot_yml配置, 以及 properties 和yml转换示例
    mybatis-plus的 mapper.xml 路径配置问题
    Windows下 启动redis
    Mysql 创建库,删除库 命令,脚本
    mybatis中传入多个参数时,接口调用报错Parameter '*****' not found ...
    构建启动Vue项目
    HyperLedger/Fabric区块连网络-编译启动单节点
    HyperLedger/Fabric区块连网络 死磕fabric
  • 原文地址:https://www.cnblogs.com/-beauTiFul/p/6524898.html
Copyright © 2020-2023  润新知