【Java基础】重载和重写区别

本文详细介绍了Java中的方法重载和重写概念。方法重载发生在同一类中,通过不同的参数列表实现,而与返回值无关。重写则是在子类中对父类方法的重新定义,要求方法名、参数列表完全一致,但权限控制符不能变小,返回类型只能变小,异常类型只能变小。重写用于实现多态,减少代码重复。同时,文中还探讨了重载和重写的相关注意事项和示例。
摘要由CSDN通过智能技术生成

什么是重载?

方法名相同,参数类型、数量、顺序不同(参数的顺序不同也是重载,但是没有意义),与返回值无关。为什么不拿返回值区分重载呢?有时候我们只调用方法不在乎返回值的时候,就无法区分是否是重载了。例如

public class Demo3 {
    public static void main(String[] args) {
        Demo3 demo3 = new Demo3();
        //此时系统也不知道你调用了哪个方法对吧!
        demo3.fun()

    }
    public int fun(){
        System.out.println("int类型返回值fun()");
        return 0;
    }
    //这里会报错
    public void fun(){
        System.out.println("void类型返回值fun()");
    }
}

在这里插入图片描述

重载需要注意什么?

重载与基本数据类型.
基本类型可以自动从小类型转为大类型,若传入的参数类型大于方法期望接收的参数类型,你必须首先做缩窄转换,否则编译器就会报错。

/**
 * @author sunyuan
 * @date 2022/3/16 14:00
 */
public class Demo3 {
    public static void main(String[] args) {
        Demo3 demo3 = new Demo3();
        //默认调用fun(int x) 因为java中整数的数据类型默认是int,所以基本数据类型重载的时候需要注意一下,
        demo3.fun(1);
        byte x = 2;
        demo3.fun(x);
        //这里默认调用double 因为浮点数默认是double
        demo3.fun(2.1);
        //调用float需要 带f
        demo3.fun(2.1f);
    }

    public void fun(int x) {
        System.out.println("fun(int x)");
    }

    public void fun(byte x) {
        System.out.println("fun(byte x)");
    }

    public void fun(float x) {
        System.out.println("fun(float x)");
    }

    public void fun(double x) {
        System.out.println("fun(double x)");
    }
    
}

在这里插入图片描述

为什么要有重载?

Java的构造方法就是重载。所以很有必要重载,姑且的理解可以省很多词汇量,JDK原码这个想想不重载的话,输出字符串printlnString,输出int printlnInt ,想想多么麻烦!现在我们println的时候,调用哪个方法和我们无关,由系统决定。是不是很爽。我们只关心业务逻辑,不关心底层实现!

在这里插入图片描述

什么是重写?

子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致!即外壳不变,核心重写!

为什么要有重写?

多态的体现,减少重复的代码!
重写是不是为了增强父类的方法? 是的。和父类一样的方法骨架但是有更强的方法体 ,先不说实现,就光说架子,何为更强(可以被更多的人访问,即方法的修饰符修饰符比父类更大,但是在强大也不能忘了本呀,你的返回类型不能比父类更大呀,方法体里可以有更强的实现,但是**返回类型必须父类可控,小于父类,**抛出的异常也在父类可控范围之内,小于父类)
总结就是:【两小一大】

重写注意事项

  1. 子类方法的权限控制符不能变小;

  2. 子类方法返回的类型只能变小;

  3. 子类抛出异常的类型只能变小;

  4. 子类方法名必须和父类保持一致;

  5. 子类方法的参数类型和个数必须和父类保持一致。
    ----面试时间紧了解上面的就够了,但是多了解总是好的!-----

  6. 声为 final 的方法不能被重写。

  7. 声明为 static 的方法不能被重写,但是能够被再次声明。

  8. 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private 和 final 的方法。

  9. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。(8 9 总结起来就是Default只能在一个包下访问,一个包下才能重写Default方法)

  10. 构造方法不能被重写

在这里插入图片描述
包结构:
在这里插入图片描述
Parent.java

public class Parent {

    public void publicFun() {
        System.out.println("父类的public方法");
    }

    public final void FinalFun() {
        System.out.println("父类的FianlFun方法");
    }

    public static void publicStaticFun() {
        System.out.println("父类的publicStatic方法");
    }

    protected void protectedFun() {
        System.out.println("父类的protected方法");
    }

    void defaultFun() {
        System.out.println("父类的default方法");
    }

    private void privateFun() {
        //这肯定是父类私有的,要留清白在人间,不能什么都继承呀对不对!想成父亲的小秘密
        System.out.println("父类的private方法");
    }
}

Son1(和父类同一个包下)

package com.suny.test.chongxie;

/**
 * 一个包下的儿子
 * 所有Son1可以重写的方法
 * @author sunyuan
 * @date 2022/3/18 10:40
 */
public class Son1 extends Parent {
    @Override
    public void publicFun() {
        super.publicFun();
    }

    @Override
    protected void protectedFun() {
        super.protectedFun();
    }

    @Override
    void defaultFun() {
        super.defaultFun();
    }
}

Son2(和父类不同的包下)




/**
 * 不是一个包下的儿子
 * 所有Son2可以重写的方法
 * @author sunyuan
 * @date 2022/3/18 10:40
 */
public class Son2 extends Parent {
    @Override
    public void publicFun() {
        super.publicFun();
    }

    @Override
    protected void protectedFun() {
        super.protectedFun();
    }
}

总结起来就是:同一个包下可以重写Default方法,不同包下不可以

参考:
https://www.shouxicto.com/article/3007.html

https://cloud.tencent.com/developer/article/1890110

https://www.cnblogs.com/xwdreamer/archive/2012/04/06/2434483.html

由于能力有限,难免有不足!
欢迎交流指正!

饮水思源,对您有帮助欢迎点赞评论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值