2013-08-21 3 views
2

Скажем, у меня есть класс A и класс B. Класс B расширяет класс A. Класс A имеет один метод.Если класс наследует метод, вызывает ли вызов этого метода в этом классе суперкласс или создает локальную копию в дочернем классе?

public class notimportant 
{ 
    public void one() 
    { 
    } 
} 

public class A extends notimportant 
{ 
    public void one() 
    { 
     //assume there is a super class making this call legal which doesnt do anything 
     super.one(); 
     System.out.println("blah"); 
    } 
} 

public class B extends A 
{ 
} 

A var1 = new B();

если я вызываю 'var1.one();' закончится выход на существе:

«ли» «л»

, потому что он создает локальную копию «один()» в классе B, а затем читает то, что называет "супер(), который приводит это до метода «один()» в классе А или это просто напечатать

«бла»

, потому что он знает, что смотреть прямо в классе А

EDIT: Надеюсь, что это намного более ясно Теперь.

+2

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

+0

Я прохожу до высшего класса, затем каскадирует вниз ... не очень технический ответ, лучше видеть его по коду. – Fernando

+1

И что это за 'метод' перед именем метода. В Java нет такого модификатора. Также что такое 'S.O.Pln'? Для ввода 'System.out.println' требуется 3 секунды. –

ответ

1

Она будет следить за тем, как Вы в настоящее время он написал:

-> Новый объект класса B

-> Вызов метода One на этом объекте

-> Первая строка вызывает supermethod , приступить к его выполнению

-> После этого вторая строка печатает

Ваш код не компилируется вообще, хотя вы можете его очистить. Что мешает вам проверить это самостоятельно?

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

public class C { 
    public void test() { 
     System.out.println("Inside C"); 
    } 
} 

public class B extends C { 
    public void test() { 
     super.test(); 
     System.out.println("Inside B"); 
    } 
} 

public class A extends B { 
    public static void main(String[] args) { 
     A obj = new A(); 
     obj.test(); 
    } 
} 

Выход:

Inside C 
Inside B 
+0

Я определенно мог бы протестировать его сам ... по какой-то причине подумал, что на вопрос есть еще несколько концептуальных подпрограмм Java. Код, который вы набрали, не точно отражает мой вопрос. Класс A в этом случае не будет иметь метод test(), но просто наследует его от класса B, который уже получил бы вызов super.test(). –

+0

@ MilanNovaković: Я редактировал свой пост. Означает ли это вашу ситуацию более точно? –

+0

Да! Итак, концептуально говоря, в этом подклассе нет копии унаследованного метода, он просто знает ссылку и указывает на суперкласс? –

1

super означает ваши суперкласс – он разрешен во время компиляции.

Это не означает непосредственный родительский класс любого типа времени исполнения this.