1 package com.hzxx.demo; 2 3 public class Polymorphism { 4 5 public static void main(String[] args) { 6 Person person = new Student(); 7 /* 8 * 父类引用只能调用父类中存在的方法和属性, 9 * 不能调用子类的扩展部分, 10 * 因为父类引用指向的是堆中子类对象继承的父类 11 * 这里父类person只有一个eat方法 12 */ 13 person.eat();// 只能调用子类已经重写的父类Person的eat()方法 14 /* 15 * instanceof 16 * 这个对象是否是这个特定类或者是它的子类的一个实例 17 */ 18 if (person instanceof Student) { 19 Student stu1 = (Student) person;//把超类转换成子类 20 /* 21 * 调用子类才有的方法 22 * 但是如果强制把超类转换成子类的话, 23 * 就可以调用子类中新添加而超类没有的方法了 24 */ 25 stu1.study(); 26 stu1.walk(); 27 } 28 29 30 Behavior behavior = new Student(); 31 behavior.walk();// 只能调用子类已经重写的接口Behavior的walk()方法 32 if (behavior instanceof Student) { 33 Student stu2 = (Student) behavior; 34 /* 35 * 调用子类才有的方法 36 */ 37 stu2.study(); 38 stu2.eat(); 39 } 40 } 41 } 42 43 class Student extends Person implements Behavior { 44 45 @Override 46 public void eat() { 47 super.eat(); 48 } 49 50 @Override 51 public void walk() { 52 System.out.println("..人都要走路"); 53 } 54 55 public void study() { 56 System.out.println("..学生要学习"); 57 } 58 59 } 60 61 class Person { 62 public void eat() { 63 System.out.println("父类===人都要吃饭"); 64 } 65 } 66 67 interface Behavior { 68 void walk(); 69 }
大概就是说:超类只能调用超类的方法 不能调用子类的扩展(重写 或者 重载)方法 如果想调用 就要强制转换成子类
同样接口也是一样 想要调用扩展的方法要强制转换 (不知道是不是必须要强制换换才能调用 可能还有别的方法 )
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)