【精选】java初识多态 多态的优势和弊端

复制代码
🍬 博主介绍

👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

目录

多态的优势

多态的弊端

引用数据类型的类型转换,有几种方式

强制类型转换能解决什么问题?

代码


多态的优势

  • 在多态的形式下,右边对象可以实现解耦合,便于扩展和维护
java 复制代码
person p = new student ();
p.work(); //业务逻辑发生改变时,后续代码无需修改

多态的弊端

  • 不能使用子类的特有功能

引用数据类型的类型转换,有几种方式

  • 自动类型转换
java 复制代码
person p = new student();
  • 强制类型转换
java 复制代码
student s = (student)p;

强制类型转换能解决什么问题?

  • 可以转换成真正的子类类型,从而调用子类独有功能
  • 转换类型与真实对象类型不一致会报错
  • 转换的时候用instanceof关键字进行判断

代码

测试类test

java 复制代码
package demon8;

public class test {
    public static void main(String[] args) {
        //创建对象
        Animal a = new Dog();
        //编译看左边,运行看右边
        a.eat();

        //多态的弊端
        //不能调用子类的特有功能
        //报错的原因?
        //当调用成员方法的时候,编译看左边,运行看右边
        //那么在编译的时候会先检查左边的父类中有没有这个方法,如果没有直接报错。
        //a.lookHome();


        //解决方案:
        //变回子类类型就可以了
        //细节:转换的时候不能瞎转,如果转成其他类的类型,就会报错
        //Cat c = (Cat) a;
        //c.catchMouse();

        /*if(a instanceof Dog){
            Dog d = (Dog) a;
            d.lookHome();
        }else if(a instanceof Cat){
            Cat c = (Cat) a;
            c.catchMouse();
        }else{
            System.out.println("没有这个类型,无法转换");
        }*/

        //新特性
        //先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d
        //如果不是,则不强转,结果直接是false
        if(a instanceof Dog d){
            d.lookHome();
        }else if(a instanceof Cat c){
            c.catchMouse();
        }else{
            System.out.println("没有这个类型,无法转换");
        }

    }
}

class Animal{
    public void eat(){
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    public void lookHome(){
        System.out.println("狗看家");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃小鱼干");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
相关推荐
Flittly几秒前
【LangGraph新手村系列】(5)时间旅行:浏览历史、分叉时间线与修改过去
python·langchain
逻辑驱动的ken5 分钟前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
兔小盈15 分钟前
多线程-(五)线程安全之内存可见性
java·开发语言·多线程
REDcker19 分钟前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站
zhangfeng113327 分钟前
小龙虾 wordbuddy 安装浏览器控制器 agent-browser npm install -g agent-browse
前端·人工智能·npm·node.js
徐小夕40 分钟前
100小时,我做了一款AI CAD建模软件,开源!
前端·vue.js·github
Bigger40 分钟前
因为看不懂小棉袄的画,我写了个 AI 程序帮我“翻译”她的世界
前端·人工智能·ai编程
2301_7820404542 分钟前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
CeshirenTester43 分钟前
LangChain的工具调用 vs 原生Skill API:性能差在哪儿?
java·人工智能·langchain
yaoxin5211231 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python