Добрый день, Задачу решил интуитивно и долго. но не совсем понятно осталось, как все взаимосвязано и как работает. По порядку. Тут я заполняю лист:
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);
    }
Как абстрактный метод Book в этот лист добавляет строки:
String agathaChristieOutput = author + ": " + getBook().getTitle() + " is a detective";
String markTwainOutput = getBook().getTitle() + " was written by " + author;
В коде прикрепленном ниже в методе getOutputByBookType() в if я вставил не new AgathaChristieBook(output) а getBook(). Я понимаю что в метод getOutputByBookType() возвращается передананные аргументы agathaChristieOutput и markTwainOutput. Затем метод getOutputByBookType() передается в
public String toString() {
            return getOutputByBookType();
        }
А toString() получается передается в Book? Тогда ля чего тут public abstract Book getBook();? Очень много вопросов. какую то часть я понимаю, какую то нет. Очень буду благодарен если объясните откуда и куда все переходит, чтоб разобраться и в дальнейшем понимать детально. Спасибо большое за то что уделили время прочитав это.