код прилагаю ниже в тексте, т.к. решенную задачу уже не пикрепить. слегка обкарнаю - удалю класс с Агатой Кристи, чтоб места меньше занимать. Итак вопрос. классы MarkTwainBook и AgathaChristieBook публичные, поэтому в getOutputByBookType в проверке instanceof я просто записал this, понимая, что этот метод будет применяться из самого дочернего класса, и он достался в наследство от класса Book. А в предлагаемом правильном решении в instanceof вместо this(как у меня) используется getBook(). так как правильнее? и для чего это вообще сделано? какая практическая польза от этого? и в какой момент программа решает распечатать наш output? в методе main есть system.out.println(books), то есть распечатка всего листа books. как и почему тут срабатывает toString, который и вызывает getOutputByBookType? это потому что наш toString переопределяет такой же метод у System.our.println ? public class Solution { public static void main(String[] args) { List<Book> books = new LinkedList<Book>(); books.add(new MarkTwainBook("Tom Sawyer")); books.add(new AgathaChristieBook("Hercule Poirot")); System.out.println(books); } abstract static class Book { private String author; public Book(String author) { this.author = author; } public abstract Book getBook(); public abstract String getTitle(); private String getOutputByBookType() { String agathaChristieOutput = author + ": " + getBook().getTitle() + " is a detective"; String markTwainOutput = getBook().getTitle() + " was written by " + author; String output = "output"; //Add your code here if(this instanceof MarkTwainBook) output = markTwainOutput ; else if(this instanceof AgathaChristieBook) output = agathaChristieOutput; return output; } public String toString() { return getOutputByBookType(); } } public static class MarkTwainBook extends Book{ private String author; private String title ; public MarkTwainBook(String title) { super("Mark Twain") ; this.title = title ; } @Override public MarkTwainBook getBook(){ return this; } @Override public String getTitle(){ return this.title ; } }