You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

方法重写中的参数类型:能否修改参数类型?属于重写还是重载?

嘿,这个问题问得特别关键,刚好是面向对象编程里很容易搞混的核心知识点,我来给你掰扯清楚~

方法重写场景中修改参数类型的规则与判定

先把两个核心概念的本质拎明白,就不容易乱了:

  • 方法重写(Override):子类对父类已存在的方法做完全匹配的实现替换,核心是「同签名」,目的是实现多态特性。
  • 方法重载(Overload):同一个类(或子类继承父类方法后)里,存在多个同名但参数列表不同的方法,核心是「同名不同参」,目的是给调用者提供灵活的调用选项。

1. 重写场景中是否允许修改参数类型?

答案是:绝对不允许,至少在Java、C#、Kotlin这类主流面向对象语言里,修改参数类型会直接打破重写的必要条件。

拿Java举个直观的例子:
父类定义:

public class Animal {
    public void eat(Food food) {
        System.out.println("动物吃食物");
    }
}

如果子类这么写,根本不算重写:

public class Dog extends Animal {
    // 把参数从Food改成Meat,这不是重写!
    public void eat(Meat meat) {
        System.out.println("狗吃肉");
    }
}

编译器会把这个eat(Meat)当成一个全新的方法,和父类的eat(Food)没有任何重写关联。

2. 修改参数类型后,属于重写还是重载?

这种情况妥妥属于方法重载,因为完美符合重载的核心判定条件:

  • 方法名称完全相同
  • 参数列表(这里是参数类型)存在差异
  • 不管是在同一个类里定义,还是子类继承父类方法后新增的同名不同参方法,都算重载

还是用上面的例子,子类的eat(Meat)和从父类继承来的eat(Food),在Dog类里就是两个重载方法,你可以分别调用:

Dog dog = new Dog();
dog.eat(new Food()); // 调用父类的eat(Food)
dog.eat(new Meat()); // 调用子类的eat(Meat)

补充:容易踩坑的特殊情况

有同学可能会问:如果参数是父类和子类的关系,比如父类用Object,子类用String,算不算重写?答案依然是不算——重写要求参数列表完全一致,哪怕是父子类型的参数,也属于不同的参数列表,本质还是重载。

只有当参数列表(类型、数量、顺序)和父类方法完全匹配,同时满足其他重写规则(比如返回值兼容、访问权限不缩小等),才是真正的方法重写。

内容的提问来源于stack exchange,提问作者Aasif Solkar

火山引擎 最新活动