重载(overload)和重写(override)的区别

本文详细介绍了Java中的方法重载(overload)和重写(override)的概念、规则及区别。重载发生在同一类中,方法名相同但参数列表不同,返回值类型不影响重载。重写发生在子类与父类之间,方法名、返回值类型和参数列表必须完全相同,但方法体可以不同。重写时子类方法的访问权限不能低于父类。此外,还探讨了SystemVerilog中方法重写的特点,强调了在SystemVerilog中不存在方法重载,只有重写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重载 overload

重载的目的:节省类中的命名资源和提高代码的可读性。

重载是发生在一个类中
1、方法名相同
2、方法的参数不同(参数个数或者参数类型)
3、方法的返回值类型不影响重载
( 当两个方法的名字相同,参数也相同,但是返回值不同的时候,不构成重载 )

class Test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a, b);
        System.out.println("ret = " + ret);
    }
    public static int add(int x, int y) {
        return x + y;
    }
    public static double add(double x, double y) {
        return x + y;
    }
}
//这里两个add 的参数类型不相同,返回值类型不同,构成重载

 重写 override

重写是指 子类实现父类的同名方法,方法参数和返回值类型都完全相同;

重写发生在子类和父类之间,也就是说重写不是在同一个类里面;

在子类继承父类时,子类的方法和父类的方法相同(访问修饰限制符,返回值类型,方法名,参数列表),方法体不同,这种子类的方法将父类的方法覆盖叫做重写;

class Animal {
    public void eat(String food) { 
 		...
    }
}

class Bird extends Animal {
    @Override
    public void eat(String food) { 
		...
    }
}
//这里 Bird中的 eat 对 Animal 中的eat 进行重写
//在父子类的继承中有相同的方法,唯一不同就是方法体,
//一般是父类的该方法满足不了子类的需求所以才发生重写。

注意:

1. 重写和重载完全不一样,不要混淆
2. 普通方法可以重写,static 修饰的静态方法不能重写
3. 重写中子类的方法的访问权限不能低于父类的方法访问权限

重载和重写的区别总结如下表:

N区别重载重写
1概念方法名称相同,参数的类型及个数不同方法名称、返回值类型、参数的类型及个数完全相同
2范围一个类继承关系
3限制没有权限要求被重写的方法不能拥有比父类更严格的访问控制权限

 再回到我们的 systemverilog ,之前有提到过关于方法加 virtual 修饰的问题,简而言之就是在 子类中对父类中的方法进行 重写,加不加 virtual 修饰的区别在前面已经有过说明;

而对于 phase 而言,每个 component 的 phase 都是对 uvm_component 的phase 的重写,而且在 uvm_component 中都加了 virtual 修饰,所以至少在 方法 这个层次sv中不存在重载只存在重写(override)!!如下会报错:

class A;

  virtual function int dis(string str="A");

    $display("this is %s",str);

    dis=1;

  endfunction

endclass

class B extends A;

  function void dis(); // 只有函数名相同,参数不同

    $display("this is B");

  endfunction

endclass

多说一句,好像在 uvm_primer 中有写到过对 new 进行重载的说法,这一点留待后续讨论!!

### Java 中方法重载与方法重写区别 #### 方法重载 (Overloading) 方法重载是指在一个类中定义多个同名但参数不同的方法。这些差异可以体现在参数的数量不同、参数类型的顺序不同等方面。需要注意的是,方法的返回类型并不影响是否构成重载。 ```java class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } } ``` 上述例子展示了 `add` 方法的不同版本,它们具有相同的名称但是接受不同类型或数量的参数[^3]。 #### 方法重写 (Overriding) 当子类提供了一个与其父类中存在的某个声明完全一致的方法时,则认为该子类覆盖了这个来自超类的方法。这意味着两个方法应该有同样的签名(即相同的名字、参数列表以及返回值),并且子类中的访问控制符不应更严格于父类中的相应成员。 ```java class Animal { public void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void sound() { super.sound(); // 调用父类的方法 System.out.println("Dog barks"); } } ``` 在这个案例里,`Dog` 类通过继承自 `Animal` 并实现了自己的 `sound()` 函数来展示如何正确地执行方法重写操作[^1]。 另外值得注意的一点是,在Java中如果想要在子类里面既调用自己的实现也能够访问到父类中原有的行为的话可以通过关键字 `super` 来完成这一目标[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值