JAVA面试中,面试官最爱问的问题。

什么是方法重载和方法重写?

方法重载(Method Overloading)和方法重写(Method Overriding)是Java中两个重要的概念,它们都涉及到多态性,但用于不同的场景。

### 方法重载(Method Overloading)

方法重载是指在同一个类中,可以定义多个方法,它们具有相同的方法名,但参数列表(参数的类型、数量或顺序)不同。方法重载是编译时多态性的一种表现。

#### 特点:
1. **方法名相同**:重载的方法必须具有相同的方法名。
2. **参数列表不同**:重载的方法必须具有不同的参数列表(不同的参数类型、数量或顺序)。
3. **返回类型可以相同或不同**:重载的方法可以有相同或不同的返回类型,但返回类型不同不能作为区分重载的方法的依据。
4. **编译时决定**:方法重载是在编译时由编译器决定调用哪个方法。

#### 示例代码:

```java
class MathUtils {
    // 重载的add方法
    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;
    }

    public static void main(String[] args) {
        MathUtils mu = new MathUtils();
        System.out.println(mu.add(5, 3));         // 调用第一个add方法,输出:8
        System.out.println(mu.add(5.5, 3.2));     // 调用第二个add方法,输出:8.7
        System.out.println(mu.add(1, 2, 3));      // 调用第三个add方法,输出:6
    }
}
```

### 方法重写(Method Overriding)

方法重写是指在子类中重新定义从父类继承的方法,方法名、参数列表和返回类型必须与父类中的方法相同。方法重写是运行时多态性的一种表现。

#### 特点:
1. **方法名相同**:重写的方法必须与父类中的方法具有相同的方法名。
2. **参数列表相同**:重写的方法必须与父类中的方法具有相同的参数列表。
3. **返回类型相同**:重写的方法必须与父类中的方法具有相同的返回类型(Java 5之后,可以是协变返回类型,即返回类型可以是父类方法返回类型的子类型)。
4. **访问修饰符不能更严格**:重写的方法的访问修饰符不能比父类中的方法更严格,但可以更宽松。
5. **运行时决定**:方法重写是在运行时由Java虚拟机(JVM)决定调用哪个方法。

#### 示例代码:

```java
class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();
        
        myDog.makeSound(); // 输出:Bark
        myCat.makeSound(); // 输出:Meow
    }
}
```

### 比较总结:

- **方法重载**:
  - 发生在同一个类中。
  - 方法名相同,但参数列表不同。
  - 可以有不同的返回类型。
  - 编译时多态性。

- **方法重写**:
  - 发生在子类与父类之间。
  - 方法名、参数列表和返回类型都必须相同(或协变返回类型)。
  - 访问修饰符不能更严格。
  - 运行时多态性。

方法重载和方法重写都是Java多态性的表现形式,通过它们可以提高代码的可读性和灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值