欢迎访问宙启技术站
智能推送

Java函数的重载与覆盖(重写)的区别

发布时间:2023-06-05 17:02:24

Java是一门强类型语言,对于函数名称、参数数量和参数类型都有非常严格的限制。Java中存在两种函数的特性,分别是重载和覆盖(重写)。其中,重载指的是在一个类中可以定义多个名称相同但参数不同的函数;而覆盖指的是子类可以覆盖父类中的方法,实现自己的功能。

一、Java函数的重载

Java中函数的重载是指在同一类中允许有多个同名但参数不同的函数。对于Java编译器来说,编译器会通过参数列表的数量、类型和顺序来区分同名函数。

下面是一个非常简单的例子,演示了如何在同一个类中定义两个同名但参数不同的函数:

public class TestOverload {
    public int add(int a, int b) {
        return a + b;
    }
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    public static void main(String[] args) {
        TestOverload test = new TestOverload();
        System.out.println(test.add(1, 2));
        System.out.println(test.add(1, 2, 3));
    }
}

在上面的示例中,我们定义了两个名为add的函数,它们的参数数量和类型不同。在这种情况下,编译器会根据函数调用时传入的参数来自动判断应该调用哪个版本的函数。

二、Java函数的覆盖(重写)

Java中函数的覆盖(重写)是指子类可以重写父类中的方法。具体而言,在子类中实现一个与父类中同名、同参数列表的函数,这个函数就称为父类函数的覆盖。

下面是一个示例,演示了如何在子类中重写父类的方法:

class Animal {
    public void move() {
        System.out.println("Animal can move");
    }
}
class Dog extends Animal {
    public void move() {
        System.out.println("Dog can move");
    }
}
public class TestOverride {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog();

        animal.move();
        dog.move();
    }
}

在上面的示例中,我们定义了一个名为Animal的父类和一个名为Dog的子类。两个类中都有一个名为move的函数,但是子类重写了父类中的move方法。在调用dog.move()时,会自动调用子类中的move方法,输出"Dog can move"。

需要注意的是,当子类覆盖父类中的同名函数时,一定要保证子类函数的返回值、名称、参数列表必须与父类中的函数完全一致。此外,被覆盖的父类函数必须使用public或protected修饰符,否则子类无法访问父类函数。

另外,在Java中还有一个叫做重载的方法覆盖。当子类中定义了一个与父类中同名但参数列表不同的函数时,这个函数并不是父类函数的覆盖,而是重载。对于Java编译器来说,重载函数与覆盖函数是完全不同的函数,编译器会根据参数传值的数量和类型来决定调用哪个函数。