首页 > 解决方案 > 带有重载的 Java 函数调用

问题描述

我想知道为什么第三个输出不是 b。

这是我的代码:

public class SimpleTests {
    public void func(A a) {
        System.out.println("Hi A");
    }
    public void func(B b) {
        System.out.println("Hi B");
    }
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A c = new B();
        SimpleTests i = new SimpleTests();
        i.func(a);
        i.func(b);
        i.func(c);
    }
}
class A {}
class B extends A {}

这是输出:

Hi A
Hi B
Hi A

有人可以告诉我为什么第三个输出是Hi A,不是Hi B。因为真正的 c 是 B 的一个实例。

标签: javaoverloading

解决方案


您将重载与多态性混淆了。

使用多态性,当创建一个类 B 的实例时,该实例是 A 类的子类,被 A 类对象引用,并覆盖 A 类的方法,调用该方法将执行 B 类的方法。

通过重载,被调用的方法只知道参数声明的类型,而不知道初始化。

public class A {
    public void print() {
        System.out.println("A");
    }
}

public class B extends A {
    @Override
    public void print() {
        System.out.println("B");
    }
}    

public class Main {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A otherB = new B();
        a.print();
        b.print();
        otherB.print();
    }
}

这将输出

A
B
B

推荐阅读