当前位置: 首页高频题加分模版训练问题详情 【Java基础专题】5. 讲一下重载和重写的区别? 本问题对应的项目链接:高频题回答模版训练 回答指导:先简单回答下他们的区别,然后从 JVM 的角度分析一下(不然太浅了,没啥加分),比如有些编译期决定,有些运行期决定啥的。
共以下 14 个回答
重载是同样的函数名不同的返回值函数参数,重写是子类继承了父类的函数,函数参数相同返回值兼容父类的函数,重载是编译时发生的,重写是运行时发生的
首先分别来解释一下重写和重载。
重载指的是在同一个类中方法名相同,但是参数列表不相同的情况。参数列表不相同指的是参数的个数或者参数的顺序或者参数的类型不相同。
而重写指的是子类重写父类的方法。当一个类继承了某个类或者实现了某个接口的时候,他可以去实现父类的某个方法或者重写父类的某个方法。具体的要求就是参数列表和参数名必须相同。返回类型必须要兼容父类的返回类型。
他们的区别就是重载体现的是同一个类中的多态性。儿重写体现的是子类和父类之间的多态性。
从jvm的角度来看。重载它在调用一个方法的时候,是根据这个方法的方法签名来决定具体调用哪一个方法的。方法签名指的就是方法名和参数列表共同组合形成的一个key。它的value就是它具体的调用逻辑。所以说虫仔在调用的时候,它就可以根据你传入的参数类型来判断你具体是想要调用哪一个方法,然后执行具体的代码逻辑。而重写他调用方法是程序在运行的时候,根据这个对象的运行类型来决定具体调用哪一个方法。他的机制就是属于动态绑定机制。
1、重载:在一个类中,可以拥有同一个方法名、参数类型、参数个数不同、返回值类型不同的方法;
2、重写:继承类,对方法中的属性,比如在封装一个类信息,要输出具体的信息经常会用到重写toString()方法;
3、JVM角度?
重载是指同一个类中,编写多个具有相同名称但参数不同的方法。
重写是指子类重新定义或实现父类中已经存在的方法,返回值和形参都不能变。
从 JVM 角度来看,区别在于重载是编译时多态,重写是运行时多态,主要体现在静态绑定和动态绑定的机制上,其中重写通过虚方法表实现动态绑定。
方法重载,同一个类中同一个方法名必须有不同的参数个数或者参数类型,返回类型无要求,好处是不用起名。
方法重写,运行时多态,方法名和形参列表要相同,返回类型和父类相同或其子类
重载发生在同一个类里面,要求方法名相同,方法参数个数、类型、顺序必须要有一个不同,方法的返回值和访问修饰符可以不同。重载在编译期就能确定使用哪个方法,属于静态绑定;
重写发生在两个类里面,通常是子类重写父类方法,在运行期才能确定使用的是哪个类的方法,属于动态绑定。重写要求重写方法与被重写方法的方法名,方法参数一样,重写方法的访问修饰符范围必须大于被重写方法的访问修饰符范围;返回值类型范围和抛出异常的范围必须小于等于被重写方法的返回值类型范围和抛出异常的范围
重载是在同一个类里面方法名相同但参数不同的方法,重写是指子类实现与父类方法名,参数,返回值相同的方法,重载在编译的时候绑定,重写在运行的时候动态绑定
重载是同一个类内,方法名相同,方法参表不一样,比如String类的valueOf方法,就有很多个不同的参表int long char。
重写是子类定义了跟父类相同的方法名,参表的方法,是对父类方法的重新实现,抛出的异常是父类的类型或子类型。比如在使用HashMap放入自定义的类的时候需要重写hashcode方法和equals方法。
重载是一个类中,方法名一样,但是要求参数列表和返回类型都不一样的方法。重载的方法可以有不同的异常抛出、访问修饰符;
重写是在子类中,定义了跟父类的方法名一样,参数列表也一样的方法。
两者都能体现出java多态的特性,重载体现了编译时多态,而重写体现了运行时多态。
从JVM的角度看,重载是静态绑定,意思是在编译阶段,就决定了调用哪个方法。而重写是动态绑定,意思是运行时根据对象的实际类型,来决定调用哪个方法。
重载是在一个类中定义多个方法名相同,但是参数类型,参数个数或参数顺序不同的做法。
重写就是子类要重写一个父类中的方法,所以方法名和参数要一定相同。两个本身没什么必然关系吧
重载和重写都是多态的体现。Java中每一个类都有一个方法表,如果一个类中有同名的方法,只要参数类型或者个数、排列顺序不同、返回类型不同,Java就会认为它是一个不同的方法,放入方法表中。当调用同名方法时,就会根据参数列表去方法表中找到对应的方法执行,具体调用哪一个方法编译时就已经确定。所以重载是编译时多态的体现。而重写是运行时多态的体现,如果调用一个类的方法时,该方法在类的方法表找不到,Java就会去父类的方法表中找,找不到再去Object类中的方法表找,具体调用哪一个方法是运行时确定的。如果调用子类重写的方法时,方法的符合引用解析后指向子类中方法表的索引值(该索引值和父类方法重写方法的索引值一样),所以重写是运行时多态的体现。
重写适用于子类想要有自己独特的行为。重载适用于向针对不同参数列表分别实现不同功能的场景。
重载:是一个类中定义多个方法名相同,参数类型、参数个数或参数顺序不同的方法。
重写:是指在子类中重写一个父类中的方法,要求方法名和参数完全相同,权限修饰符范围要大于等于父类中的权限修饰符。
重载是编译期多态,在该程序进行编译时就已经将一些列重载方法给静态编译成了字节码文件;重写时运行时多态,子类重写父类的方法需要在创建子类对象并调用该重写的方法时才进行动态编译。
重载和重写都是面向对象中多态的表现
重载是编译时多态,通过使用相同的方法名,不同的参数列表和返回类型,而使得调用同名方法后表现出的状态是不一样的,这个状态是在编译器就已经决定的
重写是运行时多态,子类通过重写父类的方法,也就是方法名参数列表相同,返回类型和抛出的异常是父类的类型或子类型,访问修饰符大于父类。这样在一个父类引用指向不同子类型时,由于不同子类重写的方式不同,调用一个方法表现出的状态也不一样,这个状态是在运行时才决定的
重载是指在同一个类中定义多个方法,它们具有相同的函数名,但参数的类型,个数和顺序可能不同。它提供了一种灵活的方式来实现相似的功能。
重写是指在子类中重新定义并覆盖父类中的方法。它使子类可以根据具体的类型调用相应的方法实现。
在 JVM 中,方法重载对应 “静态分配” 的过程,也就是 JVM 在编译期就根据参数的静态类型,决定了会使用函数的哪个重载版本。而方法重写对应 “动态分配” 的过程,具体的,重写方法的调用是由字节码中的 invokevirtual 指令实现的,而 invokevirtual 指令会在运行期间,根据方法接受者的实际类型来选择方法的执行版本。