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

*Java函数的隐藏、覆盖和调用顺序*

发布时间:2023-07-06 11:04:55

在Java中,函数的隐藏、覆盖和调用顺序是与继承相关的概念。当一个子类继承了一个父类时,它会继承父类中的方法和变量。子类可以根据需要,对父类中的方法进行隐藏、覆盖或者保留原样。

隐藏是指在子类中定义一个与父类中同名的方法,使得父类中的方法被隐藏起来,子类对象调用该方法时将会执行子类中的方法。隐藏是静态绑定的,在编译时期就能够确定调用的是哪个方法。隐藏可以通过使用关键字static实现。

覆盖是指子类在继承父类的方法时,重新定义该方法,使得子类中的方法覆盖了父类中的方法。覆盖是动态绑定的,在运行时期才能够确定调用的是哪个方法。覆盖要保证方法名、参数列表和返回类型完全一致,可以使用@Override注解表示。

调用顺序是指在使用继承的类中调用相同名称的方法时,会根据对象的实际类型进行调用。如果对象是父类类型,则调用父类的方法;如果对象是子类类型,则调用子类的方法。调用顺序是动态绑定的,需要在运行时期才能确定。

下面是一个示例代码,用来说明隐藏、覆盖和调用顺序的概念:

class A {
    public void foo() {
        System.out.println("A - foo");
    }
    
    public static void bar() {
        System.out.println("A - bar");
    }
}

class B extends A {
    @Override
    public void foo() {
        System.out.println("B - foo");
    }
    
    public static void bar() {
        System.out.println("B - bar");
    }
}

public class Main {
    public static void main(String[] args) {
        A a = new B();
        a.foo();  // 输出 B - foo
        a.bar();  // 输出 A - bar
        
        B b = new B();
        b.foo();  // 输出 B - foo
        b.bar();  // 输出 B - bar
    }
}

在上面的代码中,类A和类B分别是父类和子类。子类B覆盖了父类A中的方法foo,并且隐藏了静态方法bar。在main方法中,先创建一个父类对象a,然后调用a.foo()和a.bar()方法,由于动态绑定的特性,实际调用的是子类B中的方法foo和父类A中的静态方法bar。接着,创建一个子类对象b,分别调用b.foo()和b.bar()方法,由于调用对象是子类B的实例,所以调用的是子类B中的方法foo和bar。

总结起来,隐藏是在子类中隐藏父类的方法,调用时根据引用类型确定,由于是静态绑定的特性,在编译时期就能够确定调用哪个方法;覆盖是在子类中重新定义父类的方法,调用时根据实际类型确定,由于是动态绑定的特性,在运行时期才能确定调用哪个方法;调用顺序是根据对象的实际类型来调用相同名称的方法,具有动态绑定的特性。