java面试:重载和重写有什么区别?

在Java中,重载(Overloading)和重写(Overriding)是两种重要的概念,它们在方法的定义和调用上有显著的区别。以下是重载和重写的主要区别:

1. 定义

重载(Overloading)

  • 在同一个类中,可以定义多个方法,它们的名称相同但参数列表不同(参数的类型、数量或顺序不同)。
  • 重载方法可以有不同的返回类型,但返回类型不能作为重载的唯一依据。

重写(Overriding)

  • 子类可以对父类的方法进行重新定义,方法名称、参数列表和返回类型必须相同。
  • 重写的目的是为了实现多态性,使得子类可以提供特定的实现。

2. 适用场景

重载

通常用于提高方法的灵活性。比如,可以根据不同的输入参数类型或数量来调用同一个方法。

例如,print() 方法可以重载为 print(int)print(double)print(String) 等。

重写

通常用于实现子类特有的行为,提供父类方法的具体实现。

例如,在一个 Animal 类中有一个 makeSound() 方法,子类 Dog 和 Cat 可以重写这个方法以提供不同的声音。

3. 方法签名

重载

方法的签名必须不同,即参数的类型、数量或顺序必须不同。

返回类型可以相同或不同,但不能仅通过返回类型来区分。

重写

方法的签名必须完全相同,包括方法名称、参数类型、参数数量和顺序。

返回类型必须相同,或者是返回类型的子类(协变返回类型)。

4. 访问修饰符

重载

方法的访问修饰符可以不同,没有限制。

重写

重写的方法的访问修饰符不能比被重写的方法更严格,必须是相同或更宽松的访问权限。

5. 运行时行为

重载

重载是在编译时决定的,编译器根据方法的参数类型和数量来选择调用哪个方法。

重写

重写是在运行时决定的,Java虚拟机(JVM)根据对象的实际类型来选择调用哪个方法。这是实现动态绑定和多态性的基础。

示例代码

以下是一个简单的示例,展示了重载和重写的用法:

class Animal {  

    // 重写的父类方法  

    public void makeSound() {  

        System.out.println("Animal sound");  

    }  

}  

class Dog extends Animal {  

    // 重写父类的方法  

    @Override  

    public void makeSound() {  

        System.out.println("Bark");  

    }  

}  

class Calculator {  

    // 重载方法:不同参数  

    public int add(int a, int b) {  

        return a + b;  

    }  



    public double add(double a, double b) {  

        return a + b;  

    }  



    public int add(int a, int b, int c) {  

        return a + b + c;  

    }  

}  

public class Main {  

    public static void main(String[] args) {  

        // 重写示例  

        Animal myDog = new Dog();  

        myDog.makeSound(); // 输出: Bark  



        // 重载示例  

        Calculator calc = new Calculator();  

        System.out.println("Sum of 2 integers: " + calc.add(5, 10)); // 输出: 15  

        System.out.println("Sum of 2 doubles: " + calc.add(5.5, 10.5)); // 输出: 16.0  

        System.out.println("Sum of 3 integers: " + calc.add(5, 10, 15)); // 输出: 30  

    }  

}  

重载和重写是Java中重要的面向对象编程特性。重载使得同名方法可以根据不同的参数灵活使用,而重写则允许子类提供特定的实现,从而实现多态性。在实际开发中,合理地使用重载和重写可以使代码更加清晰和可维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值