2014-09-17 4 views
0

Alright, поэтому у меня есть абстрактный класс:Кастинг на абстрактный класс

public abstract class Animal { 
    public abstract String sound(); 
} 

Таким образом, то у меня есть класс, который расширяет его:

public class Chicken extends Animal { 
    public String sound() { 
     return "Cockadoodledoo!"; 
    } 
} 

Тогда у меня есть тестовый класс с основной метод:

public class Test { 
    Chicken a = new Chicken(); 
    System.out.println((Animal)a).sound()); 
} 

Выход "Cockadoodledoo!" Поэтому мой вопрос в том, почему, если я кастую в Animal, он все еще вызывает метод в Chicken? Разве он не видел бы как объект Животного? Это потому, что sound() является абстрактным, поэтому его нельзя назвать ... но тогда это не даст мне исключения?

Заранее спасибо.

+0

он перегружен. вы должны ожидать этого. в этом случае вы не сможете называть «звук» в «Animal». – HuStmpHrrr

ответ

0

Объект, созданный в памяти, все еще является экземпляром класса Chicken. То, что вы делаете при кастинге, обрабатывает его, как если бы это был экземпляр класса Animal, то есть вы могли использовать только методы и свойства, доступные этому классу.

Так что, если ваш Chicken класс имел метод LayEgg(), например, отбрасывая его к Animal будет означать, что вы не можете вызвать этот метод (если вы не отбрасывают назад, потому что он все еще находится в памяти машины Chicken). Вы все равно можете вызвать методы, доступные для Animal, и поведение будет выполняться по фактическому объекту, который был создан.

Это точно так же, как происходит:

Animal myAnimal = new Chicken(); 
+0

Удивительно, большое вам спасибо! Это полностью отвечает на мой вопрос. – Backwardsman

+1

Технический термин, который вы ищете, это «поздняя привязка». – AVee

+0

@AVee Thankyou. –

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