Java函数的重载和覆盖的区别和应用
Java函数的重载和覆盖是Java语言中常用的两种函数定义方式。本文将分别介绍函数的重载和覆盖的区别和应用。
一、函数的重载(Overloading)
函数的重载是指在同一个类中定义多个函数,这些函数的函数名相同,但参数列表不同。在调用这些函数时,Java虚拟机会根据传入的参数列表自动匹配相应的函数进行调用。函数的重载常用在以下几种场景:
1. 参数类型不同
例如:
public int sum(int x, int y) {
return x + y;
}
public double sum(double x, double y) {
return x + y;
}
在这个例子中,函数sum被定义为两个,一个参数类型是int,另一个参数类型是double。当调用sum函数时,Java虚拟机会根据传入的参数类型匹配相应的函数进行调用。
2. 参数个数不同
例如:
public int sum(int x, int y) {
return x + y;
}
public int sum(int x, int y, int z) {
return x + y + z;
}
在这个例子中,函数sum被定义为两个,一个有两个参数(int类型),另一个有三个参数(int类型)。当调用sum函数时,Java虚拟机会根据传入的参数个数匹配相应的函数进行调用。
3. 参数顺序不同
例如:
public int sum(int x, int y) {
return x + y;
}
public int sum(String str, int x, int y) {
return Integer.parseInt(str) + x + y;
}
在这个例子中,函数sum被定义为两个,一个参数顺序是(int, int),另一个参数顺序是(String, int, int)。当调用sum函数时,Java虚拟机会根据传入的参数顺序匹配相应的函数进行调用。
二、函数的覆盖(Overriding)
函数的覆盖是指子类定义一个与父类中同名、同参数列表、同返回类型的函数,并且该函数的访问权限不能低于父类中该函数的访问权限。在调用该函数时,Java虚拟机会自动调用子类中的函数,而父类中同名的函数被隐藏。函数的覆盖常用于以下场景:
1. 子类需要改变父类的实现
例如:
class Animal {
public void eat() {
System.out.println("Animal is eating");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat is eating");
}
}
在这个例子中,子类Cat重写了父类Animal中的eat函数,改变了Animal中的实现。
2. 子类需要提供一个更具体的实现
例如:
class Animal {
public void makeSound() {
System.out.println("Animal is making sound");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat is meowing");
}
}
在这个例子中,子类Cat提供了一个更具体的makeSound函数实现,使得调用makeSound函数时能够更准确地判断出正在发声的是一只猫。
总结
函数的重载和覆盖是Java语言中常用的两种函数定义方式。它们的区别在于函数的重载是定义多个函数,在调用时自动匹配相应的函数;函数的覆盖是子类重写父类中的函数,改变函数的实现。在应用中,函数的重载常用于不同参数类型、参数个数、参数顺序等场景;函数的覆盖常用于子类需要改变父类的实现或提供一个更具体的实现的场景。
