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

「Java函数重载和覆盖」:学习如何在Java中实现函数重载和覆盖;

发布时间:2023-05-22 11:52:03

Java是一种面向对象的编程语言,拥有重载和覆盖两个重要的函数特性。函数重载指的是在同一个类中可以定义多个同名但是参数不同的函数,函数覆盖(也叫重写)指的是在一个子类中覆盖其父类中的同名函数。

函数重载

函数重载的概念实际上非常简单:就是在同一个类中可以定义多个同名的函数,只要它们的参数(参数类型、参数个数、参数顺序)不同即可。例如:

public class Calculator {
    public static int add(int a, int b) {
        return a + b;
    }
    
    public static double add(double a, double b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        System.out.println(Calculator.add(1, 2)); // 输出 3
        System.out.println(Calculator.add(1.0, 2.0)); // 输出 3.0
    }
}

上面的例子中,我们定义了两个同名函数add,分别接收两个int类型的参数和两个double类型的参数。当我们调用add函数时,Java会根据传递参数的类型自动选择正确的函数。这样我们就能够方便地定义不同类型的操作函数,提高了代码的复用性。

需要注意的是,函数重载时,返回类型和函数名称必须相同,参数列表不能完全一致,否则编译器会报错。另外,在Java中不允许仅仅通过返回类型来区分函数,因此下面的代码是非法的:

public class Calculator {
    public static int add(int a, int b) {
        return a + b;
    }
    
    public static double add(int a, int b) {
        return a + b;
    }
    
    public static void main(String[] args) {
        System.out.println(Calculator.add(1, 2)); // 编译器会报错
    }
}

函数覆盖

函数覆盖(或重写)是指在一个子类中重新定义其父类中的同名函数,以达到更改其行为的目的。覆盖时,子类中的函数必须具有相同的名称、参数列表和返回类型,否则编译器会报错。例如:

public class Person {
    public void sayHello() {
        System.out.println("Hello from person.");
    }
}

public class Student extends Person {
    public void sayHello() {
        System.out.println("Hello from student.");
    }
}

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        p.sayHello(); // 输出 "Hello from person."
        
        Student s = new Student();
        s.sayHello(); // 输出 "Hello from student."
    }
}

在上面的例子中,我们定义了一个Person类,其中包含一个sayHello方法,输出一句问候语。然后,我们定义了一个继承自Person的子类Student,在其中覆盖了其父类的sayHello方法,并输出另一句问候语。当我们调用sayHello方法时,会根据对象的实际类型来调用正确的方法,如果对象是Person类型,则调用父类中的方法;如果对象是Student类型,则调用子类中的方法。

需要注意的是,覆盖时子类中的方法不能低于父类的访问权限(例如父类的方法是public,则子类的方法也必须是public),否则编译器会报错。另外,Java还支持使用super关键字来调用父类中的方法,例如:

public class Person {
    public void sayHello() {
        System.out.println("Hello from person.");
    }
}

public class Student extends Person {
    public void sayHello() {
        super.sayHello();
        System.out.println("Hello from student.");
    }
}

public class Main {
    public static void main(String[] args) {
        Student s = new Student();
        s.sayHello(); // 输出 "Hello from person." 和 "Hello from student."
    }
}

在上面的例子中,我们在子类中的方法中使用super关键字调用了父类中的sayHello方法,然后再输出另一句问候语。这样做可以保留父类中的行为,同时添加新的行为。