具有重载的 Java 函数调用

2022-09-04 06:51:37

我想知道为什么第三个输出不是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

有人能告诉我为什么第3个输出是,而不是。因为实数 c 是 B 的一个实例。Hi AHi B


答案 1

你混淆了重载和多态性。

使用多态性时,当创建类 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

答案 2

对重载方法的调用在编译时基于参数的引用类型 (),而不是运行时的对象类型 () 进行解析。您声明变量为 类型 ,因此将其视为 类型 。ABAA