方法重载与方法重写

目录

(一)方法重载

(1):什么是方法重载?

(2):为什么要有方法重载?

(3)方法重载用法

(4):方法重载是怎么实现的?(方法签名)

(二)方法重写

(1)什么是方法重写?

(2)方法重写用法

(三)方法重写与方法重载特性对比


(一)方法重载

(1):什么是方法重载?

定义:方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数——百度百科

(2):为什么要有方法重载?

public class Overloading {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = addInt(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = addDouble(a2, b2);
        System.out.println("ret2 = " + ret2);
    }
    public static int addInt(int x, int y) {//int类型参数的方法
        return x + y;
    }
    public static double addDouble(double x, double y) {//double类型的方法
        return x + y;
    }
}

上面是一段简单的代码,如果方法中传入的类型参数类型不同,就要调用不同的方法,这样确实能解决问题,但却要提供许多不同的方法名,比如如果我传入的一个参数是int类型,一个参数是double类型,就还需要创建第三个方法,这无疑是非常麻烦的,所以就需要用方法重载来解决这个问题。

(3)方法重载用法


public class Overloading {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(a, b);
        System.out.println("ret = " + ret);
        double a2 = 10.5;
        double b2 = 20.5;
        double ret2 = add(a2, b2);
        System.out.println("ret2 = " + ret2);
        double ret3 = add(a,a2);
        System.out.println("ret3 = " + ret3);
    }
    public static int add(int x, int y) {//int类型参数的方法
        return x + y;
    }
    public static double add(double x, double y) {//double类型的方法
        return x + y;
    }
    public static double add(int x, double y){//int与double类型的方法
        return x+y;
    }
}

如以上代码,虽然调用的方法名相同,但因传入的参数类型不同,所以就构成了方法的重载

(4):方法重载是怎么实现的?(方法签名)

  在同一个作用域中不能定义两个相同名称的标识符。比如:方法中不能定义两个名字一样的变量,那为什么类中就 可以定义方法名相同的方法呢?答案就是方法签名

方法签名:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成 方法完整的名字。

如图中是我将代码编译后,使用javap汇编工具来查看,发现,三个方法的名称是不同的

二)方法重写

(1)什么是方法重写?

定义:重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要定义特定 于自己的行为, 也就是说子类能够根据需要实现父类的方法。

(2)方法重写用法

定义一个父类Animal


public class Animal {//父类Animal定义了,有一个eat方法
    public void eat() {
        System.out.println("吃饭");
    }
}

 子类dog继承父类Animal,未重写父类方法

public class Dog extends Animal{//子类dog继承父类Animal
    public static void main(String[] args) {
        Dog dog = new Dog();
      dog.eat();
    }


}

未重写父类eat方法输出结果

 子类dog继承父类Animal,重写父类方法

public class Dog extends Animal{
    @Override
    public void eat() {//重写父类eat方法
        System.out.println("狗吃骨头");
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
      dog.eat();

    }


}

重写父类eat方法后输出结果

(三)方法重写与方法重载特性对比

1:重载发生在同一个类中重写发生在父子类之间。

2:重载要求方法的参数列表必须不同而重写的参数列表必须与被重写的方法完全相同。

3:重写方法的返回类型必须与被重写方法的方法相同或为其子类型重载方法的返回类型可以不同。

4:重写的方法的访问权限不能比被重写的方法更严格

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值