Java语言中,方法重载和方法覆写之间的区别是什么?什么时候可以使用方法覆写呢?
方法重载是指在一个类中,方法名称相同而参数列表(参数个数、类型、顺序)不同,对权限符没有要求;\n方法重写是指子类重写父类的方法,方法的名称、参数列表全部相同,重写方法的权限符必须大于等于被重写方法的权限符
重载是同一个名字的函数,可以有不同类型、不同数量的参数。
覆写是实现某个接口或者继承某个类时,将这个接口或者类中的某个方法重新实现,函数名称和参数完全一致。
Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令。
这两种指令,均属于 Java 虚拟机中的虚方法调用。
在绝大多数情况下,Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。
那么,相对于静态绑定的非虚方法调用来说,虚方法调用更加耗时。
方法重载和方法覆写的区别是什么?以及什么情况下应该使用方法覆写?
方法重载和方法覆写是Java中两种重要的方法实现机制。
方法重载指在一个类中定义多个方法,这些方法具有相同的名称,但参数列表不同,可以有不同的返回类型,实现不同的功能。
方法覆写是子类对父类的和某个方法(具有相同的名称和参数列表)重新定义,重新定义后,子类可以使用自己的实现重写父类的方法,从而实现自己的功能。
方法重载应该在满足以下条件时使用:
需要给方法不同的参数类型,可以接受相同的方法名,从而提高代码的可读性和可用性。
需要为相同的操作提供不同的方法名称,这些方法是同一个类或已知的子类的子集,但返回的类型可以不同。
需要有不同的返回类型,但参数(名称和顺序)必须相同。
方法覆写应该在满足以下条件时使用:
一个子类想修改或添加一些新的功能;
在继承关系中的子类中可以调用父类的方法,但有时候我们需要在子类中对父类的方法进行细节调整,这时候我们就需要使用方法覆写。
示例:
//方法重载 public class OverloadTest { public void test(){ System.out.println("test1"); } public void test(int a){ System.out.println("test2"); } public void test(int a,int b){ System.out.println("test3"); } public static void main(String[] args){ OverloadTest o=new OverloadTest(); o.test(); o.test(1); o.test(1,2); } }
//方法覆写 class Animal{ public void move(){ System.out.println("动物可以移动"); } }
class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } }
public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}