重载,重写,多态

重写

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变
重写意味着可以重写任何能够访问的现有方法

声明为 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运算符进行判断

posted @   吃掉这颗薄荷糖  阅读(614)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示