Java的方法重载与方法重写,差点让我迷了路... 这篇文章~超详细讲解!!!

方法重载:如果一个类有多个名字相同但参数个数、类型、(类型)顺序不同的方法。

方法重写:如果子类具有和父类一样的方法(参数相同、返回类型相同、方法名相同,但方法体可能不同)。方法重写用于提供父类已经声明的方法的特殊实现,是实现多态的基础条件。

在这里插入图片描述

1、方法重载

在 Java 中,有两种方式可以达到方法重载的目的。

改变参数的数目:

public class OverloadingByParamNum {
    public static void main(String[] args) {
        System.out.println(Adder.add(10, 19));
        System.out.println(Adder.add(10, 19, 20));
    }
}

class Adder {
    static int add(int a, int b) {
        return a + b;
    }

    static int add(int a, int b, int c) {
        return a + b + c;
    }
}  

通过改变参数类型,也可以达到方法重载的目的

public class OverloadingByParamType {
    public static void main(String[] args) {
        System.out.println(Adder.add(10, 19));
        System.out.println(Adder.add(10.1, 19.2));
    }
}

class Adder {
    static int add(int a, int b) {
        return a + b;
    }

    static double add(double a, double b) {
        return a + b;
    }
}

还可以通过改变参数类型顺序达到目的

public class OverloadingByParamType {
    public static void main(String[] args) {
        System.out.println(Adder.add(19.2, 10));
        System.out.println(Adder.add(10, 19.2));
    }
}

class Adder {
    static double add(double a, int b) {
        return a + b;
    }

    static double add(int b, double a) {
        return a + b;
    }
}

你们是否也想问main()方法是否可以重载呢?答案肯定的。

毕竟 main() 方法也是个方法,只不过,Java 虚拟机在运行的时候只会调用带有 String 数组的那个 main() 方法。

public class OverloadingMain {
    public static void main(String[] args) {
        System.out.println("String[] args");
    }

    public static void main(String args) {
        System.out.println("String args");
    }

    public static void main() {
        System.out.println("无参");
    }
}

第一个 main() 方法的参数形式为 String[] args,是最标准的写法;第二个 main() 方法的参数形式为 String args,少了中括号;第三个 main() 方法没有参数。

运行结果:

String[] args

2、方法重写

在 Java 中,方法重写需要满足以下三个规则:

  • 重写的方法必须和父类中的方法有着相同的名字;
  • 重写的方法必须和父类中的方法有着相同的参数;
  • 必须是 is-a 的关系(继承关系)。
public class Bike extends Vehicle {
    @Override
    void run() {
        System.out.println("自行车在跑");
    }

    public static void main(String[] args) {
        Bike bike = new Bike();
        bike.run();
    }
}

class Vehicle {
    void run() {
        System.out.println("车辆在跑");
    }
}

3、二者区别

二者区别经常出现在面试题里~dddd

Java中重写(Override)与重载(Overload)的区别:

  • 发生位置
    重载:一个类中
    重写:子父类中
  • 参数列表限制
    重载:必须不同的
    重写:必须相同的
  • 返回值类型
    重载:与返回值类型无关
    重写:返回值类型必须一致
  • 访问权限
    重载:与访问权限无关
    重写:子类的方法权限必须不能小于父类的方法权限
  • 异常处理:
    重载:与异常无关
    重写:异常范围可以更小,但是不能抛出新的异常

4、 总结

方法重载的注意点: 两同一不同

  • ‘两同’:在同一个类,方法名相同;
  • ‘一不同’:参数不同。

方法重写的注意点: 两同一小一大

  • ‘两同’:方法名相同,参数相同;
  • ‘一小’:子类方法声明的异常类型要比父类小一些或者相等;
  • ‘一大’:子类方法的访问权限应该比父类的更大或者相等。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛同学debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值