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 IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构