Java语法入门学习笔记第六篇继承和多态继续Java入门学习这篇整理继承和多态这是面向对象的精髓用生活化的例子帮你理解。一、继承1.1 为什么需要继承假设我们要写狗类和猫类// 狗类classDog{Stringname;intage;voideat(){System.out.println(name正在吃饭);}voidsleep(){System.out.println(name正在睡觉);}voidbark(){System.out.println(name汪汪汪);}}// 猫类classCat{Stringname;intage;voideat(){System.out.println(name正在吃饭);}voidsleep(){System.out.println(name正在睡觉);}voidmew(){System.out.println(name喵喵喵);}}发现问题了吗name、age、eat()、sleep()这些代码重复写了两遍狗和猫都是动物有很多共同特征。能不能把共同的部分抽出来复用一下这就是继承。1.2 什么是继承继承就是子类把父类的属性和方法拿过来用自己只需要写特有的部分。就像儿子继承父亲的财产父亲有的儿子都有儿子还能有自己的东西。被继承的类叫父类 / 基类 / 超类继承的类叫子类 / 派生类1.3 继承的语法用extends关键字class子类名extends父类名{// 子类特有的内容}用继承重新写狗和猫// 父类动物classAnimal{Stringname;intage;voideat(){System.out.println(name正在吃饭);}voidsleep(){System.out.println(name正在睡觉);}}// 子类狗继承动物classDogextendsAnimal{// 只需要写狗特有的voidbark(){System.out.println(name汪汪汪);}}// 子类猫继承动物classCatextendsAnimal{// 只需要写猫特有的voidmew(){System.out.println(name喵喵喵);}}publicclassTest{publicstaticvoidmain(String[]args){DogdognewDog();dog.name旺财;dog.eat();// 从父类继承来的dog.sleep();// 从父类继承来的dog.bark();// 子类自己的CatcatnewCat();cat.name咪咪;cat.eat();cat.sleep();cat.mew();}}输出旺财正在吃饭 旺财正在睡觉 旺财汪汪汪 咪咪正在吃饭 咪咪正在睡觉 咪咪喵喵喵 继承的好处代码复用不用重复写相同的代码。二、super关键字2.1 为什么需要super如果子类和父类有同名的成员直接访问会优先用子类自己的。想用父类的怎么办用super。classFather{intmoney100;}classSonextendsFather{intmoney50;voidshowMoney(){System.out.println(儿子的钱money);// 子类自己的System.out.println(父亲的钱super.money);// 父类的}}publicclassTest{publicstaticvoidmain(String[]args){SonsonnewSon();son.showMoney();}}输出儿子的钱50 父亲的钱1002.2 super的用法super的三个作用super.成员变量访问父类的成员变量super.方法名()调用父类的成员方法super(参数)调用父类的构造方法classFather{Stringname父亲;voidsayHello(){System.out.println(我是父亲);}}classSonextendsFather{Stringname儿子;voidtest(){System.out.println(super.name);// 访问父类变量super.sayHello();// 调用父类方法}}三、子类构造方法3.1 先有父再有子创建子类对象时会先调用父类的构造方法再调用子类的构造方法。就像先有父亲才有儿子。classFather{Father(){System.out.println(父亲的构造方法);}}classSonextendsFather{Son(){// 这里默认有一行 super(); 调用父类无参构造System.out.println(儿子的构造方法);}}publicclassTest{publicstaticvoidmain(String[]args){SonsonnewSon();}}输出父亲的构造方法 儿子的构造方法3.2 父类有参构造怎么办如果父类只有有参构造子类必须显式调用classAnimal{Stringname;Animal(Stringname){this.namename;System.out.println(动物构造方法);}}classDogextendsAnimal{Dog(Stringname){super(name);// 必须写调用父类有参构造System.out.println(狗构造方法);}}publicclassTest{publicstaticvoidmain(String[]args){DogdognewDog(旺财);System.out.println(dog.name);}}输出动物构造方法 狗构造方法 旺财⚠️ 注意super()必须是构造方法的第一条语句super()和this()不能同时出现父类如果只有有参构造子类必须显式调用super(参数)四、super和this的区别区别thissuper含义当前对象的引用父类对象的引用访问变量访问本类的变量访问父类的变量调用方法调用本类的方法调用父类的方法构造方法this()调用本类构造super()调用父类构造 简单记this找自己super找父亲。五、继承中的初始化顺序有继承关系时执行顺序是父类静态代码块 → 子类静态代码块 → 父类实例代码块 → 父类构造方法 → 子类实例代码块 → 子类构造方法classFather{static{System.out.println(父类静态代码块);}{System.out.println(父类实例代码块);}Father(){System.out.println(父类构造方法);}}classSonextendsFather{static{System.out.println(子类静态代码块);}{System.out.println(子类实例代码块);}Son(){System.out.println(子类构造方法);}}publicclassTest{publicstaticvoidmain(String[]args){newSon();System.out.println(---第二次---);newSon();}}输出父类静态代码块 子类静态代码块 父类实例代码块 父类构造方法 子类实例代码块 子类构造方法 ---第二次--- 父类实例代码块 父类构造方法 子类实例代码块 子类构造方法 静态代码块只执行一次类加载时实例代码块和构造方法每次创建对象都执行。六、protected关键字四种访问权限在继承中的表现权限同包同类同包不同类不同包子类不同包其他类private✅❌❌❌default✅✅❌❌protected✅✅✅❌public✅✅✅✅ protected就是专门给子类用的不同包的子类也能访问。七、final关键字final可以修饰变量、方法、类7.1 修饰变量常量不能修改finalintNUM10;// NUM 20; // 编译报错不能修改7.2 修饰方法不能被重写classFather{finalvoidtest(){System.out.println(父类方法);}}classSonextendsFather{// 不能重写test方法编译报错// void test() {}}7.3 修饰类不能被继承finalclassAnimal{}// 编译报错不能继承final类// class Dog extends Animal {} 我们常用的String类就是final修饰的不能被继承。八、继承 vs 组合8.1 继承is-a是一个狗是动物猫是动物 → 用继承classAnimal{}classDogextendsAnimal{}// 狗是一个动物8.2 组合has-a有一个汽车有轮胎、有发动机 → 用组合classTire{}// 轮胎classEngine{}// 发动机classCar{Tiretire;// 汽车有轮胎Engineengine;// 汽车有发动机} 实际开发中能用组合就尽量用组合继承层次不要超过3层。九、多态9.1 什么是多态多态同一件事不同对象做产生不同的结果。比如吃饭这件事猫吃饭 → 吃鱼狗吃饭 → 吃骨头人吃饭 → 吃米饭都是吃饭但不同的对象结果不一样。9.2 多态的实现条件多态必须同时满足三个条件有继承关系子类重写父类的方法父类引用指向子类对象向上转型// 1. 父类classAnimal{Stringname;Animal(Stringname){this.namename;}// 2. 父类方法voideat(){System.out.println(name在吃饭);}}// 1. 子类继承classCatextendsAnimal{Cat(Stringname){super(name);}// 2. 子类重写方法Overridevoideat(){System.out.println(name吃鱼~~~);}}// 1. 子类继承classDogextendsAnimal{Dog(Stringname){super(name);}// 2. 子类重写方法Overridevoideat(){System.out.println(name吃骨头~~~);}}publicclassTest{// 3. 父类引用作为参数publicstaticvoidfeed(Animalanimal){animal.eat();// 多态不同对象调用不同方法}publicstaticvoidmain(String[]args){CatcatnewCat(咪咪);DogdognewDog(旺财);feed(cat);// 咪咪吃鱼~~~feed(dog);// 旺财吃骨头~~~}}输出咪咪吃鱼~~~ 旺财吃骨头~~~十、方法重写Override10.1 什么是重写子类对父类的方法重新实现方法名、参数列表、返回值都一样只是方法体不同。就像儿子继承了父亲的手艺但自己改进了做法。classFather{voidcook(){System.out.println(父亲做的菜);}}classSonextendsFather{Override// 重写的注解帮我们检查是否正确voidcook(){System.out.println(儿子做的菜更好吃);}}10.2 重写的规则⚠️ 重写的规则方法名、参数列表必须和父类一样返回值类型可以一样或者是父子关系访问权限不能比父类更严格父类public子类不能是privatestatic、private、final修饰的方法不能被重写构造方法不能被重写10.3 重写 vs 重载区别重写Override重载Overload位置子类和父类之间同一个类中方法名必须相同必须相同参数列表必须相同必须不同返回值相同或父子关系可以不同作用子类重新实现父类方法同一个方法名处理不同参数十一、向上转型和向下转型11.1 向上转型父类引用指向子类对象自动转换安全。AnimalanimalnewCat(咪咪);// 向上转型自动的animal.eat();// 调用的是Cat的eat方法多态三种使用场景// 1. 直接赋值Animala1newCat(咪咪);// 2. 方法传参publicstaticvoidfeed(Animala){a.eat();}feed(newDog(旺财));// 3. 方法返回publicstaticAnimalgetAnimal(){returnnewCat(咪咪);}⚠️ 向上转型后只能调用父类有的方法不能调用子类特有的方法。11.2 向下转型父类引用转回子类引用需要强制转换有风险。AnimalanimalnewCat(咪咪);// 向下转型需要强转Catcat(Cat)animal;cat.mew();// 可以调用子类特有方法了风险如果实际不是这个类型会报错AnimalanimalnewDog(旺财);// Cat cat (Cat)animal; // 运行报错ClassCastException11.3 instanceof关键字向下转型前先用instanceof判断一下更安全AnimalanimalnewDog(旺财);if(animalinstanceofCat){Catcat(Cat)animal;cat.mew();}elseif(animalinstanceofDog){Dogdog(Dog)animal;dog.bark();}instanceof判断左边的对象是不是右边的类型是就返回true。十二、多态的优缺点12.1 优点1. 避免大量if-else代码更简洁不用多态voiddrawShape(Stringtype){if(type.equals(圆形)){System.out.println(●);}elseif(type.equals(方形)){System.out.println(■);}elseif(type.equals(三角形)){System.out.println(▲);}}用多态classShape{voiddraw(){}}classCircleextendsShape{Overridevoiddraw(){System.out.println(●);}}classSquareextendsShape{Overridevoiddraw(){System.out.println(■);}}voiddrawShape(Shapeshape){shape.draw();// 一行搞定不用if-else}2. 扩展能力强新增一个三角形只需要写一个新类继承Shape不用改原来的代码。12.2 缺点代码运行效率稍微降低需要动态判断调用哪个方法不能直接调用子类特有的方法十三、注意不要在构造方法中调用重写方法这是一个坑看代码classFather{Father(){func();// 构造方法中调用了可重写的方法}voidfunc(){System.out.println(Father.func());}}classSonextendsFather{intnum1;Overridevoidfunc(){System.out.println(Son.func() num num);}}publicclassTest{publicstaticvoidmain(String[]args){SonsonnewSon();}}输出Son.func() num 0为什么num是0而不是1因为创建Son对象时先调用Father的构造方法此时Son的num还没初始化还是默认值0但已经触发了多态调用了Son的func方法。⚠️ 结论构造方法中尽量不要调用可重写的方法容易出问题。总结本文整理了Java继承和多态的核心知识点继承部分继承子类复用父类的代码用extendssuper访问父类的变量、方法、构造方法子类构造先父后子初始化顺序父静态 → 子静态 → 父实例 → 父构造 → 子实例 → 子构造final修饰变量不能改修饰方法不能重写修饰类不能继承组合优先于继承多态部分多态三条件继承、重写、父类引用指向子类对象重写子类重新实现父类方法向上转型自动安全但只能调用父类方法向下转型强转有风险用instanceof判断多态好处代码简洁易扩展坑不要在构造方法中调用重写方法继承和多态是面向对象的精髓理解了这些面向对象就算入门了。下一篇继续学习接口和抽象类。Java入门学习笔记系列持续更新中。
企业数字化 ERP 产品动态
相关推荐
用treg add注册自定义HTTP端点:base-url与secret绑定完整实战 用treg add注册自定义HTTP端点:base-url与secret绑定完整实战 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg
🧭 treg add 是… · 2026/9/27 1:29:44
停车管理系统源码解析:JSP后台与Python车牌识别双栈架构实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:29:31
在 HarmonyOS 上使用 expo-battery 这篇文章用一个使用 react-native CLI 创建的纯 RN 工程,iOS 和 Android 都在跑,里面用 expo-battery 读电池信息的 demo app 为例子,给它加上了 HarmonyOS 支持,业务代码一行没改,同一份 App.tsx 现在跑在三个平台上。… · 2026/9/27 1:29:19
红酒数据集分析实战:Spearman相关、主成分回归与KNN分类 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:37:40
AI论文写作工具推荐:11款初稿修改与交稿整理工具 手上已经有论文草稿,真正拖慢交稿的地方通常不是再生成一遍全文,而是把论证、引用、段落和文件整理接起来。无论当前处理的是论文草稿还是开题报告,已有初稿时,先按当前最挡路的一步选 AI论文写作工具:需要把 DOCX 放进… · 2026/9/27 3:37:40
2760张伤口图像VOC+YOLO双格式数据集实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:37:40
基于FFmpeg与FFprobe的视频去重实战:从原理到跨平台流水线 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:37:27
自己做的视频网站如何赚钱怎么选 视频网站变现5步走:SEO怎么选才不踩坑 备案流程一头雾水?很多创业者卡在第一步,以为搞定了服务器和域名,网站就能直接上线收钱。其实,没搞定ICP备案,你的视频站连门都进不去,更别提赚钱了。这时候, 怎么选… · 2026/9/27 3:37:27
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01