重载,重写,多态
重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变
重写意味着可以重写任何能够访问的现有方法
声明为 static 的方法不能被重写,但是能够被再次声明。
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类
当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
重写的前提是继承。
public class Fu {
public void method(){
System.out.println("这是父类的方法");
}
}
public class Zi extends Fu {
public void method(){
System.out.println("这是子类的方法,重写了父类的方法");
}
}
编译阶段只检查参数的引用类型
然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。
能编译成功,是因为父类里面也存在method方法,运行的时候调用的是子类的method方法。编译看左,运行看右。
重载
重载是在一个类里面(方法能够在同一个类中或者在一个子类中被重载),方法名相同,参数不同,返回类型可以相同可以不相同。
无法以返回值类型作为重载函数的区分标准。
public class Fu {
public void method(){
System.out.println("这是父类的方法");
}
}
public class Zi extends Fu {
public void method(String name){
System.out.println("子类叫" + name);
}
}
public class Test2 {
public static void main(String[] args) {
Fu fu = new Zi();
fu.method(); // 这是父类的方法
// fu.method("name"); Error
if(fu instanceof Zi){
Zi zi = (Zi)fu;
zi.method(); // 这是父类的方法 向上查找
zi.method("name"); // 子类叫name
}
}
}
方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
多态
多态存在的三个条件:继承、重写、父类引用指向子类对象
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
运行时期:也是调用父类中的成员变量。
public class Fu {
int id = 999;
public void method(){
System.out.println("这是父类的方法");
}
}
public class Zi extends Fu {
int id = 100;
public void method(){
System.out.println("这是子类的方法,重写了父类的方法");
}
}
public class Test2 {
public static void main(String[] args) {
Fu fu = new Zi();
fu.method();
System.out.println(fu.id) // 999
}
}
动态绑定(学好多态的关键)
声明类型是指声明引用变量所使用的类型
实际类型是指创建实例对象的实际类类型
方法可以在父类中定义而在子类中重写
在编译时,引用变量的类型是由声明类型决定的
在运行时,引用变量的类型是由实际类型决定的
引用变量在编译时,所调用的方法都必须是在声明类型的类中定义了的,这样才能通过编译。
在运行时,调用的是实际类型里面的方法,如果实际类型里面没有该方法,就会向上查找(沿着继承链)。
当需要使用实际类里面的方法,就需要将声明类型的引用变量强制转换为实际类类型。在转型前要先判断,属于声明类型的引用变量能不能转换成实际类类型。
使用instanceof运算符进行判断
【推荐】国内首个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语句:使用策略模式优化代码结构