带有重载的Java函数调用

cce*_*asy 13 java overloading

我想知道为什么第三个输出不是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 {}
Run Code Online (Sandbox Code Playgroud)

这是输出:

Hi A
Hi B
Hi A
Run Code Online (Sandbox Code Playgroud)

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

SBy*_*ans 16

你在使用多态进行重载时感到困惑.

使用多态,在创建类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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出

A
B
B
Run Code Online (Sandbox Code Playgroud)


khe*_*ood 11

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