Динамическая отправка в Java - PullRequest
0 голосов
/ 21 декабря 2011

Предположим, у меня есть класс A, который определяет метод bar(). Метод bar() вызывает другой метод foo(). Затем я расширяю A в B, переопределяю foo() и не переопределяю bar() (поэтому он наследуется). Какой foo() вызывается в этих двух случаях?

A a = new B();
a.bar(); // A or B's foo called?

B b = new B();
b.bar(); // A or B's foo called?

Ответы [ 4 ]

3 голосов
/ 21 декабря 2011

В обоих случаях используется функция foo ().A a просто обращается к методам B, поскольку B является экземпляром.

Думайте об A a как об интерфейсе для экземпляра, в данном случае: new B ()

Вот пример (в Groovy): http://groovyconsole.appspot.com/script/616002

1 голос
/ 21 декабря 2011

В A a = new B(); и B b = new B();

a и b являются экземплярами класса B , поэтому будет вызываться метод time b foo () .

Поскольку, если метод переопределен в дочернем классе (в данном случае B class), экземпляр дочернего объекта будет вызывать этот метод, присутствующий в своем собственном классе, а не в родительском классе (в данном случае, A класс).

0 голосов
/ 21 декабря 2011

Вызов метода зависит только от типа объекта, для которого вызывается метод, а не от ссылочного типа, который используется для вызова.

Поскольку в вашем случае в обоих случаях должен вызываться метод объекта типа B, оба будут вызывать функцию foo ().

class C {
    public void foo() {
        System.out.println("foo in C");
    }

    public void bar() {
        System.out.println("calling foo");
        foo();
    }
}


class B extends C {
    public void foo() {
        System.out.println("foo in B");
    }
}


public class A {


    public static void main(final String[] args) {
        C c = new B();
        c.bar(); // C or B's foo called?

        B b = new B();
        b.bar(); // C or B's foo called?

    }

И вывод:

calling foo
foo in B
calling foo
foo in B
0 голосов
/ 21 декабря 2011

Это вызовет метод foo для B в обоих случаях. В Java все вызовы методов отправляются динамически - не имеет значения, по какой ссылке или контексту вы его называете - вызов метода будет основываться на типе объекта.

...