@k5hu Ответов: 1

Переопределение методов и приведение объектов в java


<pre>class Alpha
{
    public String doStuff(String msg)
    {return msg;}
}
class Beta extends Alpha
{
    public String doStuff(String msg)
    { return msg.replace('a','e');}
}
public class Main extends Beta
{ public String doStuff(String msg)
{
    return msg.substring(2);
}
  public static void main (String[]args)
  {
    List <Alpha> strs=new ArrayList<>();
    strs.add(new Alpha());
    strs.add(new Beta());
    strs.add(new Main());
    for(Alpha t:strs)
    {    
        System.out.println(t.doStuff("Java"));
    }
}
}

выход
Ява
Джев
ва

Что я уже пробовал:

насколько я понимаю, это так :

В цикле for,
первая итерация,
анонимный объект Alpha и объект 't' Alpha будут указывать на одно и то же место, поэтому мы получим вывод в виде Java

но во второй итерации,
свойства анонимного объекта бета-версии будут присвоены 't', который, как я ожидал, выдаст ошибку, но программа выдает результат.

Может ли кто-нибудь объяснить, что происходит во второй и третьей итерациях ?

1 Ответов

Рейтинг:
12

Jochen Arndt

Это Полиморфизм (учебники Java™ > изучение языка Java > интерфейсы и наследование)[^] особенность.

Приведенная выше ссылка описывает его, дает пример, похожий на ваш, и, наконец, прибивает его к ногтю:

Цитата:
Виртуальная машина Java (JVM) вызывает соответствующий метод для объекта, на который ссылаются в каждой переменной. Он не вызывает метод, который определяется типом переменной. Это поведение называется вызовом виртуального метода и демонстрирует аспект важных особенностей полиморфизма в языке Java.

В вашем примере объекты в списке имеют тип Alpha, Beta, и Main Даже в то время как t объявляется как Alpha, соответствующий doStuff() называется метод "реального" объекта.


@k5hu

Огромное спасибо :) Я был сбит с толку повышением скорости. Теперь мне все ясно.