了解Java中的方法重载和重写及其区别。
方法重载和重写都是面向对象编程中常见的概念,两者虽然都涉及到方法,但是要想熟练应用这两者,必然需要充分理解它们在Java中的含义和区别。接下来,本文将详细介绍Java中的方法重载和重写及其区别。
一、方法重载
方法重载(Overloading)指的是在同一个类中定义了多个同名的方法,但这些同名方法的参数类型或者参数个数不同。Java通过方法的参数类型、参数个数和返回值来区分不同的方法,当调用一个重载方法时,Java到底调用哪一个方法,是由实参的数据类型和形参的数据类型是否匹配决定的。
代码示例:
public class Overloading {
public void info(String name) {
System.out.println("姓名:" + name);
}
public void info(String name, int age) {
System.out.println("姓名:" + name + ",年龄:" + age);
}
public void info(int age, String name) {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
在上面的例子中,我们在Overloading类中定义了三个同名的方法info,但方法的参数类型和参数个数不同,分别接收一个String类型参数,一个String类型和一个int类型参数,以及一个int类型和一个String类型参数。当我们调用这个类的info方法时,Java会根据传入的参数类型和参数个数,来匹配相应的方法并调用。
例如:
public class Test {
public static void main(String[] args) {
Overloading o = new Overloading();
o.info("张三");
o.info("王五", 20);
o.info(18, "李四");
}
}
以上代码输出结果为:
姓名:张三 姓名:王五,年龄:20 姓名:李四,年龄:18
二、方法重写
方法重写(Overriding)指的是在子类中覆盖父类的方法。当子类继承父类后,可以通过在子类中定义一个与父类中相同名称的方法来实现方法的重写,但是子类重写父类方法时,必须保证方法名、参数列表以及返回值类型完全相同,并且访问修饰符不能比父类的更严格。
当子类调用重写方法时,Java虚拟机会按照就近原则在子类中寻找该方法,如果找到了就直接调用,否则会在父类中查找该方法。因此在执行重写方法时,实际调用的方法是子类中定义的方法而不是父类中的相同名称的方法。
代码示例:
public class Animal {
public void move() {
System.out.println("Animal can move");
}
}
public class Dog extends Animal {
public void move() {
System.out.println("Dog can move");
}
}
在上面的例子中,我们定义了两个类Animal和Dog,Dog继承了Animal。我们在Animal类中定义一个move方法,而在Dog类中重写了该方法,并输出了不同的内容。当我们实例化一个Dog对象并调用它的move方法时,就会输出"Dog can move",而不是"Animal can move"。
例如:
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
Dog d = new Dog();
a.move();
d.move();
}
}
以上代码输出结果为:
Animal can move Dog can move
三、方法重载和重写的区别
1.定义位置
方法重载和重写都是发生在类中的方法之间,但两者的定义位置和方式不同。方法重载在一个类中定义多个同名方法,但是参数列表必须不同。方法重写发生在继承关系中,子类重写了父类中的某个方法,方法名、参数类型和返回值类型必须一致,访问修饰符不能比父类更严格。
2.调用方式
方法重载的调用发生在编译期,由编译器根据方法参数的类型、数量和顺序来选择对应的方法。方法重写的调用发生在运行期,由JVM在内存中查找实际调用的对象类型,然后根据该类型调用相应的方法。
3.返回类型
方法重载的返回类型可以相同,也可以不同;方法重写的返回类型必须相同,如果不同将会导致编译时错误。
4.访问修饰符
方法重载的访问修饰符可以相同,也可以不同;方法重写的访问修饰符不能比父类更严格,如果更严格将会导致编译时错误。
5.运行类型
方法重载的选择在编译期已经确定了具体的方法;方法重写的选择必须等到运行期根据实际的对象类型确定具体的方法。
四、总结
方法重载和重写是Java中两个常见的面向对象编程概念,虽然两者都涉及到方法,但是它们的定义、特点和应用场景是不同的。方法重载用于在一个类中定义多个同名方法,但是参数列表必须不同,用于处理同一种类型的不同情况;方法重写用于在继承关系中,子类重写了父类中的某个方法,用于重写父类方法的具体实现。方法重载和重写都是Java中常用的多态性的体现方式,可以使代码更加简洁、具备更强的可读性和维护性。但是,在应用方法重载和重写的时候,一定要小心处理,避免出现低级错误,使程序变得不可读、不可维护。
