при использовании метода super (). какие методы вызываются в этой ситуации - PullRequest
4 голосов
/ 25 июня 2010

Предположим, у вас есть объект типа BlahChild, который является расширением BlahParent, что происходит, когда BlahChild вызывает super (). SomeMethod и someMethod содержат вызов другой функции, anotherMethod (), которая также переопределяется в BlahChild?

Вызывается ли другой метод BlahChild или другой метод BlahParent?

Ответы [ 4 ]

6 голосов
/ 25 июня 2010

Нестатические методы всегда виртуальные в Java, поэтому да .

Из википедии:

В Java все нестатические методы по умолчанию являются «виртуальными функциями». Только методы, помеченные ключевым словом final, которые нельзя переопределить, наряду с закрытыми методами, которые не наследуются , не являются виртуальными.

Это вызовет реализацию BlahChilds.

Пример:

class Parent {
    public void method() {
        System.out.println("Parent: method");
    someOtherMethod();
    }
    public void someOtherMethod() {
        System.out.println("Parent: some other");
    }
}


class Child extends Parent {

    @Override
    public void method() {
        System.out.println("Child: method");
        super.method();
    }

    @Override
    public void someOtherMethod() {
        System.out.println("Child: some other");
    }
}

public class Test {
    public static void main(String[] args) {
        new Child().method();
    }
}

Выход:

Child: method
Parent: method
Child: some other   // <-- Child.someOtherMethod gets called, from Parent.method
3 голосов
/ 25 июня 2010

Вы должны действительно опубликовать конкретный код для таких вопросов.

Однако из вашего описания это звучит так, как будто anotherMethod() является виртуальным (то есть не окончательным), и объект является BlahChild, поэтому переопределяетсяпредполагается, что должна быть вызвана версия в BlahChild.

Почему бы вам не проверить это самостоятельно?

2 голосов
/ 25 июня 2010

Будет вызван переопределенный метод в дочернем классе.

супер (). SomeMethod

Это даже не скомпилируется. Вы, вероятно, имеете в виду super.someMethod(), и, возможно, вас смутила идея, что super возвращает что-то вроде «скрытого экземпляра суперкласса», для которого затем вызывается метод. Там нет такой вещи. Вызов метода - это, по сути, сообщение объекту, говорящее «пожалуйста, выполните кусок кода с этим именем», и затем объект смотрит на свой класс, чтобы увидеть, что это за фрагмент кода. super - это просто способ заставить объект взглянуть на его суперкласс, который концептуально нечист, но часто очень полезен, поскольку многим переопределяющим методам требуется функциональность переопределяемого ими метода (и делать что-то дополнительное до и / или после). 1010 *

0 голосов
/ 25 июня 2010

Я взломал весь следующий пример, и поскольку методы являются виртуальными, вызов метода super вызывает метод в дочернем классе:

check здесь для объяснения

так что выполнение примера дает:

child: test1 // call to child.test1()
child: test2 // child test2() gets called

super: test1 // call to super.test1()
child: test2 // child.test1 gets called

пример кода:

package de.congrace.doodles;

public class ChildClass extends SuperClass {
    @Override
    public void test1() {
        System.out.println("child: test1");
        test2();
    }
    @Override
    public void test2() {
        System.out.println("child: test2");
    }

    private void callSuperTest() {
        super.test1();
    }
    public static void main(String[] args) {
        ChildClass c=new ChildClass();
        c.test1();
        c.callSuperTest();
    }
}



package de.congrace.doodles;

public class SuperClass {
    public void test1() {
        System.out.println("super: test1");
        test2();
    }
    public void test2() {
        System.out.println("super: test2");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...