2015-11-02 3 views
0

я наткнулся на вопрос в последнее время на многоуровневом наследовании в Java, вопрос заключается в следующем:Многоуровневое Наследование в Java

public class Test{ 

     public static void main(String[] args) { 
      A c = new C(); 
      c.print(); 
     } 

    } 
    class A{ 
     public void print(){ 
      System.out.println("Inside A"); 
     } 
    } 

    class B extends A{ 
     @Override 
     public void print(){ 
      System.out.println("Inside B"); 
     } 
    } 
    class C extends B{ 

    } 

Так что мой вопрос, почему это печать, как «Внутри B». Поскольку класс C не переопределяет метод print(), и поэтому он должен разрешить метод, основанный на времени компиляции, и, следовательно, должен печатать «Внутри A». Пожалуйста, дайте мне знать, если я ничего не пропущу. Спасибо за помощь.

+5

_it должен разрешить метод, основанный на компиляции time_ - это false – GriffeyDog

+0

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

+0

Почему вы думаете, что 'C' должен пропустить метод переопределения своего прямого родителя и вместо этого использовать один из его« дедушек »? – Tom

ответ

5

C расширяет B, что означает, что он будет иметь те же методы, что и B, и этот случай B переустановил метод, таким образом C также получит его.

1

Это печать «Внутри B», потому что это класс, который расширяется C, и B, таким образом, является суперклассом C.

1

Вы вводите в заблуждение две вещи.

Если метод переопределен один или несколько раз, будет запущена версия в конкретном подклассе. Вот почему используется версия в B.

С другой стороны, при выборе между перегруженными методами решение основано на типе времени компиляции аргументов.

1

c имеет тип A, но сам A был инициализирован, как экземпляр C, и так как C расширяет B и B переопределение A, оба B и C метод переопределения внутри A. Но так как C не переопределяет B, метод используется от B.

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

1

По законам наследования в Java все функции базового класса используются производными классами, в том числе переопределенными. Любой класс, который наследуется от промежуточно унаследованного класса, примет переопределенное определение. Это само собой разумеется, поскольку эти переопределенные функции переопределяют любое определение функции перед ним в иерархии наследования. Поэтому переопределенная функция действует как определение базового класса любого производного класса под ним.

Смежные вопросы