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

Java函数的重载和覆盖:如何使用不同的方法名和参数进行方法重载和覆盖

发布时间:2023-06-25 23:55:31

在Java中,重载(Overloading)和覆盖(Overriding)是两种非常基础和重要的概念。方法重载指的是在同一个类中定义多个同名的方法,但它们的参数列表不同。方法覆盖指的是子类重新定义了继承自父类的同名方法。

在本文中,我们将讨论如何使用不同的方法名和参数进行方法重载和覆盖。

方法重载

在Java中,方法重载是指在同一个类中有多个同名方法,但是它们的参数类型、参数个数或参数顺序不同。下面是一个简单的例子:

public class Calculator {
    public int add(int x, int y) {
        return x + y;
    }

    public double add(double x, double y) {
        return x + y;
    }
}

这个例子中,我们定义了两个add方法。 个add方法接收两个int类型的参数,第二个add方法接收两个double类型的参数。这两个add方法虽然同名,但是它们的参数类型不同,因此Java编译器会根据不同的参数类型,在编译时选择调用相应的方法。

当然,在方法重载时要注意参数顺序也是可以不同的。例如,下面例子中的swapping方法就是对前三个数进行了不同的重载:

public class Calculator {
    public void swapping(int x, int y) {
        int temp = x;
        x = y;
        y = temp;
    }

    public void swapping(int x, int y, int z) {
        int temp = x;
        x = y;
        y = z;
        z = temp;
    }

    public void swapping(int x, int y, double z) {
        int temp = x;
        x = (int)z;
        y = (int)z;
        z = temp;
    }
}

上述三个方法都执行了数据交换,但是它们接受的参数的顺序以及所处理的值的类型都不相同,因此编译器不会将它们看作同一个方法。

需要注意的是,重载方法的返回类型可以相同也可以不同。但是,仅仅是返回类型的不同不能完全定义出一个新的方法。例如,下面这个例子:

public class Calculator {
    public int add(int x, int y) {
        return x + y;
    }

    public void add(int x, int y) {
        System.out.println(x + y);
    }
}

这个例子中,我们尝试使用相同的方法名和参数列表来定义两个不同的方法,其中一个方法返回int类型,而另一个方法则没有返回值。但是,Java编译器会因为这两个方法的函数签名一样而报错,他认为这两个方法是相同的。

方法覆盖

方法覆盖是指子类重新定义了从父类中继承来的同名方法。在方法覆盖中,子类可以更改父类方法的行为。

下面是一个简单的例子:

public class Animal {
    public void makeNoise() {
        System.out.println("Animal makes noise.");
    }
}

public class Dog extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Dog barks.");
    }
}

public class Cat extends Animal {
    @Override
    public void makeNoise() {
        System.out.println("Cat meows.");
    }
}

这个例子中,我们定义了一个Animal类,其中包含了一个叫做makeNoise的方法。然后,我们从Animal类继承了Dog和Cat两个子类,并在这两个子类中重载makeNoise方法。

在这个例子中,我们使用了@Override注解,这是为了提醒编译器我们打算重载一个父类中的方法。这并不是必要的,但是它可以让代码更加易读易懂,也可以避免一些潜在的问题。

需要注意的是,在方法覆盖时,子类方法的访问修饰符不能比父类方法更严格。例如,如果父类方法是public,则子类方法只能是public或protected。如果子类方法声明了一个不同的异常列表,则它所抛出的异常必须是父类方法所抛出异常的一种子类,或者是与父类方法完全相同的异常。否则,编译器将会报错。

总结

重载和覆盖是Java的两个非常基础和重要的概念。方法重载指的是在同一个类中定义多个同名的方法,但它们的参数列表不同。方法覆盖指的是子类重新定义了继承自父类的同名方法。

在方法重载时要注意参数顺序也是可以不同的。而方法覆盖时,子类方法的访问修饰符不能比父类方法更严格,而且子类方法抛出的异常列表必须是父类方法所抛出异常的一种子类,或者是与父类方法完全相同的异常。