Java基础-重载与重写

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

重写和重载是java多态的重要组成部分,两者的区别也是java学习者和使用者必须掌握的要点。


一、什么是重载?

重载的全称

方法重载 overload

重载的定义

指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。

其中 方法的方法名+参数列表,合起来也称为“签名”。
所以重载也可以阐述为,一个类中定义的多个同名但不同签名的方法。
这里的不同可以是,参数类型、参数数量、参数顺序的任一不同。
需要注意,在使用时,基本类型为参数的情况下,如果没有完全对应的类型,会结合自动转换去匹配类型。
ps:重载对访问范围修饰词(public、protect、default、private)不做限定
对返回值同样不做限定。可以理解为,重载的方法间,其实只有方法名相同,匹配上不同参数列表之后就是在调用不同的方法。

重载的代码演示

//声明一个测试类,用于声明重载的方法
public class OverloadTest {
    //声明一个say方法,参数为String类型
    public static void say(String text){
        System.out.println("重载1:我输入的是String类型的"+text);
    }
    //再声明一个say方法的重载,参数为int类型
    public static void say(int text){
        System.out.println("重载2:我输入的是int类型的"+text);
    }
    //再声明一个say方法的重载,参数为double类型
    public static void say(double text){
        System.out.println("重载3:我输入的是double类型的"+text);
    }
    //再声明一个say方法的重载,参数为int类型、String类型
    public static void say(int text,String str){
        System.out.println("重载4:我输入的是int类型的"+text+"和String类型"+str);
    }
    //再声明一个say方法的重载,参数为String类型、int类型
    public static void say(String str,int text){
        System.out.println("重载5:我输入的是和String类型"+str+"int类型的"+text);
    }


    public static void main(String[] args) {
        say("(。・∀・)ノ゙嗨");//重载1:我输入的是String类型的(。・∀・)ノ゙嗨
        say(9527);//重载2:我输入的是int类型的9527
        say(3.5);//重载3:我输入的是double类型的3.5
        say(3.2f);//重载3:我输入的是double类型的3.200000047683716;发生了自动类型转换的匹配
        byte a = 2;
        say(a);//重载2:我输入的是int类型的2;发生了自动类型转换的匹配
        say(9527,"你好");//重载4:我输入的是int类型的9527和String类型你好
        say("再见",173);//重载5:我输入的是和String类型再见int类型的173
    }
}

二、什么是重写?

重写的全称

方法重写 Override

重写的定义

指父子类中,子类对父类的方法进行的覆盖操作。用于 子类希望修改 从父类继承来的方法 的情况。

重写的代码演示

1.关于重写的作用的演示
首先,即使子类中没有eat方法,也会继承父类的eat方法,所以father和son都可以eat,且效果一致。
但如果儿子想要不一样,就可以像对say方法一样,在自己的类中以相同的方法名和参数列表去重写say方法的方法体,让son的say和father的say产生不同的效果。

public class OverrideTest {
    public static void main(String[] args) {
        Father father = new Father();
        Son son = new Son();
        father.eat();//老子要吃饭
        son.eat();//老子要吃饭
        father.say();//拉老子的意大利炮来
        son.say();//拉儿子的歼星炮来
    }
}
class Father{
    public void eat(){
        System.out.println("老子要吃饭");
    }
    public void say(){
        System.out.println("拉老子的意大利炮来");
    }
}
class Son extends Father{
    public void say(){
        System.out.println("拉儿子的歼星炮来");
    }
}

2.关于重写的限制
必须明确:重写的 方法名和参数列表 必须和父类同名方法完全一致
然后在访问范围上:子类重写的方法,访问权限必须大于或者等于父类方法的权限
在返回值类型上:子类的返回值类型,基本类型则需相同,引用类型则需相同或子类(也可以理解为更小,狗类继承于动物类,狗类是动物类的子类,也可以形象地认为狗类小于动物类)。

class Father{
    protected double test1(){ return 1.1; }
    protected double test2(){ return 1.1; }
    protected double test3(){ return 1.1; }
    protected Father test4(){ return new Father(); }
    protected Son test5(){ return new Son(); }
}
class Son extends Father{
    //扩大访问范围没事
    public double test1(){ return 1.1; }//编译正常
    //缩小访问范围就会报错
    private double test2(){ return 1.1; }//编译报错
    //对于返回值为基本类型时,返回值类型必须相同
    public int test3(){ return 1; }//编译报错
    //对于返回值为引用类型时,返回值类型是 父类方法的返回值类型 的子类,是可以的
    protected Son test4(){ return new Son(); }//编译正常
    //对于返回值为引用类型时,返回值类型是 父类方法的返回值类型 的父类,不可以
    protected Father test5(){ return new Father();}//编译报错
}

三、两者的差别汇总

在这里插入图片描述
口诀:
重写:父子类同名同参,访问更高返回小。
重载:同类同名不同参,访问返回都不限。

关于代码中两者辨析的技巧

其实重写和重载常常同时发生,在方法名一致的前提下,
①一般先通过对比父子类中参数列表确定到底是重写还是重载,如果参数列表不一致,那么就是重载,对访问权限、返回值就都没什么限制。
②如果子类和父类中同名方法的参数列表一致,那么就要根据重写的限制要求去判断访问权限返回值是否符合规范。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值