2012-02-15 3 views
3

У меня есть супер класс:Java метод коррекции вызова

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(), и я думаю, что будет вызван метод super, но был вызван метод переопределения в подклассе.

если я это сделать:
SuperClass superClass = new SuperClass();
superClass.dosomething();


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

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

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

так:

SuperClass sub = new SubClass();
sub.firstMethod();
sub.secondMethod();

ответ

1

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

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

+0

Я думаю, что эта функция очень полезна, но я просто не знаю, как она работает в деталях :( – Felix

+2

@Felix: что не нужно вы понимаете, что это зависит от типа выполнения вашего объекта, а не от типа, в котором была определена переменная. –

3

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

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

+0

"(игнорирование статических и частных методов)" –

+0

@JoachimSauer: добавлено частное исключение в ответе. Благодарю. – amit

1

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

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

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

+0

Как мы можем вызвать методы суперкласса ... Будет ли 'this.firstMethod()' работать вместо firstMethod() внутри doSomeThing() базового класса ??? .... – aProgrammer

+1

проверить мое редактирование !! –

+0

@aProgrammer Это все равно. – Felix

1

Действительно супер йоЗотеЬЫпд вызывается. Что-то вызывает firstMethod и secondMethod, которые являются виртуальными методами (любой метод в Java по умолчанию является виртуальным, что означает, что он может быть переопределен). Таким образом, их переопределенные версии вызываются.

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