【Java 入门 Day10】多态|java整活天花板,一个父类变量拿捏全子类,抽象玩法全解析开篇前言(下)
继承是儿子蹭老爹资源,多态就是老爹的户口本(父类引用)既能绑定亲儿子、二儿子、三儿子,父类变量灵活指向任意子类对象,是面向对象最抽象、项目用得最多的特性,搞懂多态直接通关面向对象大半难点。
一、多态核心定义:父类引用指向子类对象(语法:父类 引用名 = new 子类 ())
经典示例:
java运行
//父类Animal引用a,实际装的是Dog狗子对象 Animal a=new Dog();人话梗翻译:户口本(Animal 引用 a)登记户主是动物,但户口本实际持有者是狗子,编译看左边(父类)、运行看右边(子类)。
- 编译阶段:只能调用父类写过的属性、普通方法,户口本只能用户主规定权限;
- 运行阶段:如果子类重写了父类方法,优先跑子类重写方法,户主名头、办事是儿子来干。
举生活化梗: 老板(父类人)招聘员工(子类程序员 / 产品 / 测试),统一用工牌(父类引用)管理,工牌都是员工,但是敲代码、画原型、找 bug 各自干活逻辑不一样,这就是多态落地。
二、父子引用双向转换(多态核心操作,避坑指南)
1. 向上转型(小→大,自动转 = 多态原生写法)
子类引用直接赋值给父类,不用强转,Dog d=new Dog();Animal a=d;梗:员工证件(子类)上交换成通用工牌(父类),上交流程全自动不用额外手续,也就是多态原生写法。
2. 向下转型(大→小,强制转换,极易翻车)
父类引用转回子类,必须强制类型转换,语法:子类 变量=(子类)父类引用;
java运行
Animal a=new Dog(); Dog d=(Dog)a;⚠️翻车惨案:实际对象是猫,强行转狗子,运行直接报ClassCastException类型转换异常。
java运行
Animal a=new Cat(); Dog d=(Dog)a;//编译能过,运行直接崩3. 救命关键字 instanceof,杜绝转型报错
用法:引用名 instanceof 类名,判断引用实际对象能不能匹配目标类,匹配返回 true,反之 false。
java运行
Animal a=new Dog(); if(a instanceof Dog){ Dog d=(Dog)a; }人话:换证件前先核验身份,是狗子再换回狗子证件,不是直接跳过转换,完美规避转型翻车。
4. 无继承不能转
两个毫无血缘的类,父子强转编译直接报错,狗子和水杯没关系,不能互相换证件。
三、多态三大落地场景(项目天天用)
- 数组存储:父类数组,能存所有子类对象
java运行
//动物数组,狗、猫全塞进去 Animal[] arr={new Dog(),new Cat()};梗:统一收纳箱,既能装狗粮也能装猫粮,箱子规格统一,内部东西各不相同。 2.方法传参:形参写父类,所有子类实例都能当实参传入 方法void feed(Animal an){},调用既能喂狗也能喂猫,一个方法适配全子类。 3.方法返回值:返回值写父类,方法能返回任意子类对象。
四、多态的真香优势
- 屏蔽子类差异,统一管控:不用给狗、猫分别写喂食方法,统一父类接收,减少冗余代码;
- 代码灵活易扩展:后续新增兔子子类,原有喂食、数组代码一丁点不用改,直接新增兔子类即可接入,拓展性拉满。
五、三大特性终极总结(整活总结)
- 封装:锁死内部数据,对外开放正规接口 = 私房钱上锁,存取走银行窗口;
- 继承:子类白嫖父类资源,is-a 血缘绑定 = 富二代继承家产;
- 多态:父类引用装全子类,统一管理不同子类 = 统一工牌管理五花八门打工人。
