Java 函数中的重载和覆盖
Java中的重载和覆盖是两个重要的概念,它们都与函数相关。在本篇文章中,我们将讨论Java函数中的重载和覆盖的概念、区别和应用。
1.重载
重载是指在一个类中声明多个方法,它们的方法名相同,但参数列表不同。这样的方法称为重载方法。Java中的重载方法可以被分为两种类型:方法重载和构造函数重载。
方法重载:在一个类中定义了多个方法名相同、但参数类型或参数个数不同的方法,称之为方法重载。例如:
public class OverloadExample {
public int sum(int a, int b) {
return a + b;
}
public int sum(int a, int b, int c) {
return a + b + c;
}
public double sum(double a, double b) {
return a + b;
}
}
在上面的示例代码中,定义了三个名为sum的函数,函数名相同但参数不同。第一个sum函数接收两个int类型的参数,第二个接收三个int类型的参数,第三个接收两个double类型的参数。通过这种方式,我们可以在不同的情况下使用同一个方法名来编写不同的逻辑,提高了代码的重用性。
构造函数重载:与方法重载相似,构造函数也可以被重载。例如:
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(int age) {
this.age = age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在上面的示例中,定义了4个不同的构造函数,它们都具有不同的参数列表,但都有相同的函数名“Person”。这样,我们可以使用不同的参数来创建Person对象。
重载的限制:
1.不能仅根据返回类型的不同来进行重载:Java不允许两个方法只有返回类型不同而重载的情况。
public class WrongOverloadExample {
public int sum(int a, int b) {
return a + b;
}
public double sum(int a, int b) {
return a + b;
}
}
在示例代码中,第二个sum函数与第一个sum函数的参数类型相同,但返回类型不同。将会发生编译错误。
2.重载函数必须在参数列表上有所不同:例如不能像下面这样重载函数。
public class WrongOverloadExample {
public int sum(int a, int b) {
return a + b;
}
public int sum(int b, int a) { // 参数列表顺序相反
return a + b;
}
}
2.覆盖
覆盖是指在子类中重新定义了从父类继承来的方法,保留了方法名和参数类型或者数量,但重新定义了方法的实现。例如:
public class Animal {
public void move() {
System.out.println("Animal can move");
}
}
public class Dog extends Animal {
@Override
public void move() {
System.out.println("Dog can move on foot");
}
}
在上面的示例中,Dog类从Animal类继承了move方法,并在子类中重写了它。@Override注解用于告诉编译器这个方法是覆盖了父类的方法,如果方法名称或参数错误,编译器会报错。
使用覆盖,我们可以在子类中重新定义父类中的方法,并为它定义特定的行为。这个过程被称为方法重写(Method Overriding)。
注意事项:
1.子类中覆盖的方法必须与父类中被覆盖的方法有相同的名称、参数列表和返回类型(如果有返回值)。
2.访问修饰符必须允许重写方法在子类中访问,例如如果在父类中使用private修饰覆盖方法,子类中将无法访问这个方法。覆盖方法的访问修饰符在子类中必须比其在父类中的访问修饰符更宽松。例如,如果在父类中使用protected修饰符,则在子类中可以使用protected或public修饰符。
3.覆盖方法不能使用比在父类中覆盖的方法更广泛的异常类型。
涉及到异常和重载的时候,Java遵循下面的规则:
1.如果父类方法抛出了异常,子类覆盖该方法时只能抛出相同的异常或者是它的子类异常。也就是说,如果父类的某个方法会抛出IOException异常,那么子类在覆盖该方法时,可以抛出IOException的子类异常例如FileNotFoundException,但不能抛出更高级别的异常,如Exception。
2.重载方法可以抛出任何类型的异常,即使方法不抛出异常。
3.如果父类方法不抛出异常,子类覆盖该方法时也不能抛出任何异常。
总结
重载和覆盖是Java面向对象程序设计中的两个基本概念,它们都与方法有关。重载在同一个类中声明多个相同名称但参数列表不同的方法,可以增强代码的重用性;覆盖可以让子类以自己的实现来覆盖父类中的方法,提高了代码的灵活性。视情况而定,我们可以选择使用重载或覆盖来实现代码逻辑。如果子类仅仅是需要添加新的方法,则应该使用重载,而如果子类需要改变已有的方法行为,我们应该使用覆盖。在实际的开发过程中,使用重载和覆盖时需要遵守Java的相关规则和限制。
