Java函数重载及重写
Java中的函数重载和重写是我们在面向对象编程中经常用到的特性。虽然两者都是用于函数的多态性,但它们之间还是有一定的区别的。接下来就让我们来一一分析。
一、函数重载
函数重载是指在一个类中定义多个函数,它们具有相同的函数名,但有不同的参数列表。这些不同的参数列表可以是参数类型、参数个数或参数顺序的不同组合。例如:
public class Demo {
public void func(int a) {
System.out.println(a);
}
public void func(double b) {
System.out.println(b);
}
public void func(int a, int b) {
System.out.println(a + b);
}
}
在上面的代码片段中,我们定义了一个Demo类,其中有三个func()函数,分别接受int类型参数、double类型参数和两个int类型参数。这就是Java的函数重载,同一个函数名称,但却有不同的参数列表,因此,Java可以根据传递给函数的参数类型和数量来判断应该调用哪个函数。
二、函数重写
重写是指子类重新定义父类中已有的函数。因此,重写的方法需要具有相同的名称、参数列表和返回类型。子类重写一个已有的方法时,可以通过使用关键字“@Override”,来指出这个方法是重写了父类中的方法,如果这个方法没有正确地覆盖父类中原来的方法,编译器会给出一个错误。
下面是一个简单的例子:
class Person {
public void func() {
System.out.println("Person func");
}
}
class Student extends Person {
@Override
public void func() {
System.out.println("Student func");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.func();
Person s = new Student();
s.func();
}
}
在上面的代码中,我们定义了一个Person类,其中有一个func()函数,然后我们定义了一个Student类,它继承了Person类,并重写了func()函数。在main()函数中,我们先实例化一个Person对象,调用它的func()函数,输出的是”Person func”,接着我们实例化一个Student对象,并将其赋给一个Person类型的变量,然后调用它的func()函数,输出的是”Student func”。
在这里,我们可以看到,Java运行时会根据对象的类型来判断应该调用哪一个函数。在这种情况下,Person对象调用的是Person类中的func()函数,而Student对象调用的是Student类中重写的func()函数。这种行为就是Java的函数重写,它允许子类通过重写父类的方法,来改变父类方法的行为。
三、函数重载和函数重写的区别
函数重载和函数重写都是Java语言中实现多态性的两种方式,它们在一些表面上看起来很相似,但是它们之间却有一些重要的区别。
1. 函数名称和参数列表不同
函数的重载是允许Java在同一个类中定义多个具有相同名称但参数列表不同的函数。而函数的重写则是在父类和子类之间定义名称、参数列表和返回类型相同的函数。
2. 发生的时间不同
函数重载发生在一个类中,而函数重写是在子类中完成的。
3. 返回值类型
函数重载的返回值类型可以相同,也可以不同,但是函数重写的返回值类型必须相同。
4. 多态性机制不同
函数的重载是函数多态性中的静态多态性,这个多态性机制是在编译时发生的。而函数的重写是函数多态性中的动态多态性,这个多态性机制是在运行时发生的。
四、总结
在Java中,函数的重载和重写都是用于实现多态性的两种方式,在实际的开发中,我们会根据情况选择使用哪种多态性。在使用函数的重载时,我们需要关注参数列表的组合,因为Java会根据参数的不同选择应该调用哪一个函数;而在使用函数的重写时,我们需要关注函数的覆盖。如果没有使用Override关键字,那么在编译期间就无法发现错误。因此,使用函数的重载和重写时,需要根据实际情况进行选择,以便实现 的程序设计。
