重写与重载的定义与区别

186 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解java实现单链表,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan

文章目录

重写(OverWrite)

方法重写又叫做方法覆盖:
	1、什么时候我们会考虑使用“方法覆盖”呢?(使用时机)
		子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,
		子类有权利对这个方法进行重新编写,有必要进行“方法的覆盖”。
	2、当子类对父类继承过来的方法进行“方法覆盖”之后,
	  子类对象调用该方法的时候,一定执行覆盖之后的方法。(就近原则)
	3、怎么构成方法覆盖?
    	a):两个类必须要有继承关系。
		b):重写之后的方法和之前的方法具有:
					相同的返回值类型、
					相同的方法名、
					相同的形式参数列表。
    4、方法覆盖应该注意的几点:
		a):方法覆盖只是针对于方法,和属性无关。
		b):由private或则final修饰方法都不能被覆盖(不能被继承)
		c):方法覆盖只是针对于“实例方法”,因为“静态方法覆盖”没有意义。
		d):重写方法的返回值,可以缩小返回类型范围,但是不能增加返回类型范围
    	e):访问权限不能更低,可以更高。
    	f):重写之后的方法不能比之前的方法抛出更多的异常,可以更少。

例子:

public class OverWriteTest {
    public static void main(String[] args) {
        //创建一个父类对象并自我介绍
        Player player = new Player();
        player.selfIntroduction();

        //创建一个篮球运动员对象并进行自我介绍
        Player basketballPlayer = new BasketballPlayer();
        basketballPlayer.selfIntroduction();
    }
}

/**
 * 定义一个父类:运动员
 * 		  方法:自我介绍
 * */
class Player {
    public void selfIntroduction(){
        System.out.println("我是一个运动员!");
    }
}

/**
 * 定义一个子类继承运动员
 * */
class BasketballPlayer extends Player{
    /*
    * 虽然篮球运动员也是一个运动员
    * 但是我希望在进行自我介绍的时候
    * 突出自己的职业:篮球
    * 此时继承过来父类的方法已经无法满足需求,需要进行改进(重写)
    * */

    @Override
    public void selfIntroduction() {
        //在继承的时候,会默认通过super. 来调用父类的方法
        //super.selfIntroduction();

        //重写父类方法
        System.out.println("我是一个篮球运动员!");
    }
}

image-20220314225823500

重载(Overlord)

怎么构成方法重载?
    1、在同一个类中
    2、方法名相同
    3、参数列表不同
        参数个数不同、  参数类型不同、参数顺序不同
    
    '与方法的返回值类型无关'
    '与方法法的饰符列表无关'

使用时机:
    在一个类当中,如果几个方法功能相似的话,建议将名字定义为一致
    这样代码美观,可读性强,见名知意
    比如:System.out.println();就是最常见一个重载方法
   

例子:

public class OverLoadTest {
    public static void main(String[] args) {
        //调用同名不同参数的方法
        mySum();
        mySum(12);
        mySum(1.2);
        mySum(12,1.20);
        mySum(1.20,12);
    }

    private static void mySum() {
        System.out.println("mySum无参数的执行!");
    }

    // 这个方法的参数个数和上面的方法的参数个数不同——>构成重载
    public static void mySum(Integer num){
        System.out.println("mySum有一个Integer类型的参数执行!");
    }
    /**
     * 注意这类错误,这不构成方法重载,这是重复啦!变量名不同不构成重载!!!
     * */
    /*
        public static void mySum(Integer num){
            System.out.println("mySum有一个Integer类型的参数执行!");
        }
    */

    /**
     * 注意这类错误,这不构成方法重载,这是重复啦!返回值类型不同不构成重载!!!
     * */

    /*
        public static Integer mySum(Integer num){
            return 1;
        }
    */

    /**
     * 注意这类错误,这不构成方法重载,这是重复啦!修饰符类型不同不构成重载!!!
     * */

    /*
        int mySum(Integer num){
            return 1;
        }
    */


    // 这个方法的参数个数和上面的方法的参数类型不同——>构成重载
    public static void mySum(Double num){
        System.out.println("mySum有一个Double类型的参数执行!");
    }

    //这个和上面的两个参数个数都不同-->构成重载
    public static void mySum(Integer num1, Double num2){
        System.out.println("MySum有两个不同类型的参数(Integer x, Double y)");
    }

    // 注意:参数的顺序不同,也算不同,依旧-->构成重载
    public static void mySum(Double num1, Integer num2){
        System.out.println("MySum有两个不同类型的参数(Double num1, Integer num2)");
    }

}

class Test{
    /**
     * 这构成重载了吗?
     *      不构成,因为根本不在同一个类里面
     * */
    public static void mySum(Double num1, Integer num2){
        System.out.println("MySum有两个不同类型的参数(Double num1, Integer num2)");
    }
}

运行截图

image-20220314225754037

重载与重写的区别

方法的重载和重写都是实现多态的方式,最主要的区别在于
		'前者实现的是编译时的多态,而后者实现的是运行时的多态'
重载发生在一个类中;重写发生在有继承关系的类中(子类与父类之间)。

🤡写在最后

关于重写与重载的去呗就讲到这里 最后别忘啦支持一下博主哦,求三连!❤️❤️❤️