开发者

Java method call overloading logic

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

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜