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

Java中的函数重载与覆盖

发布时间:2023-06-15 14:30:38

1. 函数重载

函数重载是指在同一个类中可以定义多个同名但参数类型,个数,或顺序不同的函数。编译器根据调用时传入的实际参数类型、个数、顺序来确定调用哪一个函数,实现了根据不同参数类型和个数调用不同的函数,从而提高了代码的重用和可读性。

例如:

public class TestOverload {

    public void test() {

        System.out.println("No param");

    }

   

    public void test(int a) {

        System.out.println("a : " + a);

    }

   

    public void test(int a, int b) {

        System.out.println("a : " + a + " b : " + b);

    }

   

    public static void main(String[] args) {

        TestOverload t = new TestOverload();

        t.test();

        t.test(10);

        t.test(10, 20);

    }

}

输出结果为:

No param

a : 10

a : 10 b : 20

2. 函数覆盖

函数覆盖是指子类定义一个与父类中同名、同参数类型、同返回值类型的方法,即重写父类中的方法。当调用该方法时,编译器会根据实际对象类型来确定调用哪个方法。

例如:

class Parent {

    public void print() {

        System.out.println("Parent print");

    }

}

class Child extends Parent {

    public void print() {

        System.out.println("Child print");

    }

}

public class TestOverride {

    public static void main(String[] args) {

        Parent p = new Child();

        p.print();

    }

}

输出结果为:

Child print

在代码中,创建了一个Parent类型的变量p并将其赋值为Child类型的实例。调用p的print方法时,会执行Child类中的print方法,而不是Parent类中的print方法。

3. 区别

函数重载和函数覆盖在Java中有两个不同的场景和语法规则:

(1)函数重载是在同一个类中定义多个同名但参数类型、个数或顺序不同的函数,而函数覆盖是在不同的类中存在父子关系的两个方法。

(2)函数重载中要注意构成重载的方法的参数类型、个数或顺序必须不同,而函数覆盖则要注意方法名称、参数类型、个数、顺序和返回值类型必须完全相同。

(3)函数重载是静态绑定,即在编译阶段确定调用哪个方法,而函数覆盖是动态绑定,即在运行阶段根据实际对象类型确定调用哪个方法。

(4)函数重载和函数覆盖的作用不同。函数重载可以实现根据不同的参数类型和个数调用不同的函数,从而提高代码的重用和可读性;而函数覆盖可以实现多态性,即同一操作作用于不同的对象,可以通过不同的方式呈现不同的行为,从而提高代码的灵活性。

4. 总结

函数重载与函数覆盖是Java中两个重要的概念,二者都是为了提高代码的复用性和可读性,但实现的方式和作用是不同的。

函数重载是在同一个类中定义多个同名但参数类型、个数或顺序不同的函数,可以根据不同的参数调用不同的函数,提高代码的复用性和可读性。

函数覆盖是子类定义一个与父类中同名、同参数类型、同返回值类型的方法,重写父类中的方法,可以实现多态性,提高代码的灵活性。