首页 > 编程语言 >八股文-Java方法的重载与重写

八股文-Java方法的重载与重写

时间:2023-11-27 22:01:52浏览次数:28  
标签:Java 方法 类型 参数 重载 重写 public

在 Java 中,重载和重写是两个关键的面向对象编程概念。重载通过方法的参数列表不同来区分同名方法,提供了更灵活的方法调用方式。而重写通过子类重新定义父类中已经存在的方法,实现了多态性的体现,让代码更具可扩展性和维护性。

3007bc07ab5971bcd86c8c6081478add.jpg

重载(Overloading)

重载是指在同一个类中可以定义多个方法,这些方法具有相同的名称但是参数列表不同。参数列表的不同可以体现在参数的数量、类型或者顺序上。编译器在调用这些方法时,会根据提供的参数类型和数量来选择合适的方法。

示例:

public class OverloadingTest {

    // 方法重载,参数类型不同
    public void print(int num){
        System.out.println("参数(int)为:"+num);
    }

    // 方法重载,参数类型不同
    public void print(String num){
        System.out.println("参数(String)为:"+num);
    }

    // 方法重载,参数数量不同
    public void print(int num1,int num2){
        System.out.println("参数1(int)为:"+num1+"参数2(int)为"+num2);
    }
}

重写(Overriding)

重写是指子类重新定义了父类中已经存在的方法。重写的方法与父类中的方法具有相同的名称、返回类型和参数列表。在运行时,会根据对象的实际类型调用相应的子类方法,体现了多态性的概念。

示例:

//动物的父类
public class Animal {
    public void call(){
        System.out.println("Animal发出声响。。。");
    }
}

//Cat继承了Animal,重写了call方法
public class Cat extends Animal{
    @Override
    public void call() {
        System.out.println("喵喵喵,喵喵喵。。。");
    }
}

//Dog继承了Animal,重写了call方法
public class Dog extends Animal{
    @Override
    public void call() {
        System.out.println("汪汪汪,汪汪汪。。。");
    }
}

在上述例子中,Dog 和 Cat 类分别重写了 call 方法。当通过父类引用调用这个方法时,实际上会根据对象的实际类型调用相应的子类方法。

public class Test {

    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        //dog和cat的引用类型一样,调用相同的方法输出不同
        dog.call();  //输出:   汪汪汪,汪汪汪。。。
        cat.call();  //输出:   喵喵喵,喵喵喵。。。
    }
}

区别与应用场景

  • 参数不同

重载是通过方法的参数列表不同来区分同名方法的,而重写是通过子类重新定义父类方法来实现的。

  • 解析时机(编译时与运行时)

重载是在编译时确定调用哪个方法,而重写是在运行时动态绑定,根据对象的实际类型调用相应的方法。

  • 返回值

在重载中,方法的签名包括方法的名称、参数数量、类型和顺序,重载方法的返回值类型不是方法签名的一部分,而重写方法的返回值类型必须与被重写方法的返回值类型相同。

为什么返回值不同不算方法重载?

Java编译器在解析方法调用时主要依赖于方法的签名(包括方法名、参数数量、参数类型和参数顺序),而不考虑返回值类型。两个方法如果具有相同的方法签名,就会被视为重载关系。如果只有返回值类型不同,而其他部分相同,编译器无法根据方法的签名区分这两个方法,因为在调用时编译器只关心调用的方法签名,而不关心返回值类型。

总结

重载和重写是 Java 中实现多态性的两种方式,它们分别通过方法的参数列表和方法的重写来实现。这两个概念为 Java 提供了更高层次的灵活性和可扩展性,使得代码更易于理解和维护。

在实际应用中,要根据具体的情况选择使用重载还是重写,以便更好地实现程序的设计目标。同时,深刻理解这两个概念对于面向对象编程的理解至关重要。

标签:Java,方法,类型,参数,重载,重写,public
From: https://blog.51cto.com/xiuji/8588859

相关文章

  • Java换行输出
    Java换行输出的五种方法第一种:(println)System.out.print("#123");System.out.pritn("$123");//print--不会换行输出输出#123$123System.out.print("#123");System.out.println("$123");//println--输出时直接换行或者System.out.println("$123&......
  • JavaSE练习,JDBC驱动,基于swing库的带登录功能计算器
    一、前言本次作业是基于上次的计算器功能所做的改进,通过JDBC连接MySQL增加了登录与注册功能,并对计算器所作的运算进行了记录。虽然基于上次的作业所作,但是设计编写的模块大部分与之无关(登录注册自然与计算器无关)。所以本次作业属于再开发而不是运营维护。二、概要设计......
  • LeetCode-Java:27.移除元素
    题目给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数......
  • LeetCode-Java:80.删除有序数组中的重复项 II
    题目给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入......
  • LeetCode-Java:26.删除有序数组的重复项
    题目给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组......
  • Java——Map.getOrDefault方法和MapUtils.getXXX()详解
    在Java编程中,Map是一种非常常用的数据结构。Map通常用于存储键值对,其中每个键映射到一个值。当我们尝试访问一个不存在的键时,Map会返回null值。这在某些情况下可能会导致错误,因此Java8引入了一个新的方法getOrDefault(),该方法可用于解决这个问题。getOrDefault()方法的语法如下:该......
  • 在Linux系统上部署Java开发环境
    简介Java是一门跨平台的编程语言,可以在各种操作系统上运行。在Linux系统上部署Java开发环境,可以让开发人员在Linux系统上进行Java开发、编译、运行和调试。环境准备在部署Java开发环境之前,需要准备以下环境:一台Linux系统的服务器或虚拟机一个终端工具,如SSH一个文件传输工......
  • java基础学习:三元运算符,运算符的优先级
    三元运算符介绍:格式:条件表达式?值1:值2;执行流程:首先计算关系表达式的值,如果值为true,返回值1,如果值为false,返回值2代码:packagecom.itheima.operator;publicclassOperator6{publicstaticvoidmain(String[]args){//目标:三元运算符的基本使用do......
  • java基础学习:逻辑运算符
    &:前后均为true,结果才为true|:只要多个条件中有一个为true,结果就是true^(逻辑异或):前后结果相同时返回false,结果不同时返回true  &&(短路与):左边为false,右边则不执行||(短路或):左边为true,右边就不执行......
  • java基础学习:关系运算符
     判断相当用“==”双等于号packagecom.itheima.operator;publicclassQperator4{publicstaticvoidmain(String[]args){inta=10;intb=5;System.out.println(a=b);//输出结果为5,因为把b值为5赋值给了a}}......