вызов метода переопределения Java - PullRequest
3 голосов
/ 15 февраля 2012

У меня супер класс:

public class SuperClass {

    public void dosomething() {
        firstMethod();
        secondMethod();
    }

    public void firstMethod() {
        System.out.println("Super first method");
    }

    public void secondMethod() {
        System.out.println("Super second method");
    }
}

Подкласс:

public class SubClass extends SuperClass {

    public void dosomething() {
        super.dosomething();
    }

    public void firstMethod() {
        System.out.println("Sub first method");
    }

    public void secondMethod() {
        System.out.println("Sub second method");
    }
}

Тестовый класс:

public static void main(String[] args) {
      SubClass sub = new SubClass();
      sub.dosomething();
      SuperClass sup = new SuperClass();
      sup.dosomething()
}

когда я запускаю тестовый метод, я получаю это:

Sub first method
Sub second method

Можете ли вы сказать мне, как это произошло? В методе подкласса dosomething я вызвал super.dosomething() и думаю, что будет вызван супер-метод, но был вызван метод переопределения в подклассе.

если я сделаю это:
SuperClass superClass = new SuperClass();<br/> superClass.dosomething();

Результат:
Супер первый метод
Супер второй метод

Разница заключается в месте вызова метода. Я думаю, должно быть что-то, чего я не знаю):

упс, в первом примере суперссылка указывала на подкласс ...

вот так:

SuperClass sub = new SubClass();<br/> sub.firstMethod();<br/> sub.secondMethod();<br/>

Ответы [ 4 ]

3 голосов
/ 15 февраля 2012

В java методы binding всегда динамические [игнорируя статические и приватные методы здесь]. Таким образом, когда вы переопределяете firstMethod() и secondMethod(), каждый раз, когда объект типа SubClass будет пытаться вызвать один из них - будет вызван переопределенный метод - даже если он [вызов] из родительского метода.

Итак, как и ожидалось - когда вы вызываете super.doSomething(), он вызывает firstMethod() и secondMethod(), и вызывается переопределенный метод.

1 голос
/ 15 февраля 2012

Ваш объект, для которого вызываются методы, имеет тип SubClass, а не SuperClass. Даже если вы вызываете метод, который определен только в SuperClass, ваш контекст выполнения остается SubClass. Таким образом, любой вызываемый метод, который переопределяется, фактически выполняет переопределенный метод.

От этого следует отказаться: объявив firstMethod и secondMethod как public, SuperClass фактически позволяет подклассам переопределять свое поведение. Если это не подходит, методы должны быть закрытыми или окончательными.

1 голос
/ 15 февраля 2012

Действительно, супер-что-то вызывается. Сделайте что-нибудь, вызывая firstMethod и secondMethod, которые являются виртуальными методами (любой метод в Java по умолчанию является виртуальным, что означает, что его можно переопределить). Поэтому их переопределенные версии называются.

Вы можете запретить их переопределение, если отметите их как окончательные.

1 голос
/ 15 февраля 2012

Super.dosomething() фактически вызывает метод dosomething() в Super классе. Но внутри этого метода вы вызываете 2 функций, которые firstMethod и secondMethod. Эти методы перезаписываются в классе Sub и вызываются из класса Sub.

Как Петр Иванов предложил:

Вы можете предотвратить их переопределение, если отметите их как окончательные

...