Переопределение методов и приведение объектов в 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', который, как я ожидал, выдаст ошибку, но программа выдает результат.
Может ли кто-нибудь объяснить, что происходит во второй и третьей итерациях ?