多态--动态绑定
1、当调用对象方法的时候,该方法会和该对象的运行类型绑定,如果在运行类型中没找到该方法,那么触发继承机制,去运行类型的父类去找方法。
2、当调用对象属性时,没有动态绑定机制,属性在哪里声明,就在哪里使用,不是看编译类型
1、
class A{ public int 1 = 10; public int sum(){ return getI() + 10; } public int sum1(){ return i + 10; } public int getI(){ return i; } } ================================== class B extends A{ public int i = 20; public int sum(){ return i + 20; } public int getI(){ return i; } public int sum1(){ return i + 10; } } ================================== public class Test{ psvm{ A a = new B();//向上转型 sout(a.sum());//运行类型是B,所以这里走b的方法sum(),输出40 sout(a.sum1());//运行类型是B,所以这里走b的方法sum1(),输出30 } }
2、※
注意:编译类型为父类,运行类型为子类 的对象,不能直接去运行子类的方法
class A{ public int 1 = 10; public int sum(){ return getI() + 10; } public int sum1(){ return i + 10; } public int getI(){ return i; } } ================================== class B extends A{ public int i = 20; /* public int sum(){ return i + 20; } */ public int getI(){ return i; } /* public int sum1(){ return i + 10; } */ } ================================== public class Test{ psvm{ A a = new B();//向上转型 sout(a.sum());//30 //运行类型B中的sum方法消失了。触发继承机制,找父类A中的sum()方法,A中sum方法getI()方法触发了动态绑定机制,去找运行类型B的getI()方法,B中getI()方法的i在B中声明,那么i的值就是20。总结下来,这里用A中的sum()=20++10方法,B的getI()=20,B的i=20,输出30 sout(a.sum1());//20 //运行类型B中sum1()方法消失了。触发机制,找父类A中的sum1()方法,A中sum1()方法中的i在父类A中被声明,那么这里的i=10。总结下来,这里用A中的sum()1=10+10,A的i=10,输出20 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律