开发者

Java method call overloading logic

开发者 https://www.devze.com 2022-12-15 23:51 出处:网络
For the following code why does it print A, B? I would expect it to print B, B. Also, does the method call performed by the JVM is evaluated dynamically or statically?

For the following code why does it print A, B? I would expect it to print B, B. Also, does the method call performed by the JVM is evaluated dynamically or statically?

public class Main {
    class A {

    }

    class B extends A {

    }

    public void call(A a) {
        System.out.println(开发者_StackOverflow"I'm A");
    }

    public void call(B a) {
        System.out.println("I'm B");
    }


    public static void main(String[] args) {

        Main m = new Main();
        m.runTest();
    }

    void runTest() {
        A a = new B();
        B b = new B();

        call(a);
        call(b);
    }

}


Overloading is determined statically by the compiler. Overriding is done at execution time, but that isn't a factor here.

The static type of a is A, so the first method call is resolved to call(A a).


Since your object is known by its type A at that moment, the method with argument A is invoked. So yes, it's determined statically.

That's in order to avoid ambiguities. Your B is also an A - but both methods can't be invoked at the same time.


B is a subclass of A. Since you instanciate a B, but assign it to a variable typed A, all B specifics will be 'lost', hence call(a) will be dispatched to call(A, a) and print 'A'.

0

精彩评论

暂无评论...
验证码 换一张
取 消