Я относительно новичок в Java. Я выполнял упражнение, в котором мы исследуем полиморфное поведение экземпляров подклассов и суперклассов. Это упражнение основано на концепциях абстрактных классов и интерфейсов. В этом упражнении представлены списки массивов. Один из вопросов требует, чтобы мы создали ArrayList объектов WrittenWork, называемых продуктами, и добавили соответствующие объекты в ArrayList.
Моя проблема в том, что ArrayList продолжает печатать первый элемент 3 раза, а затем печатает остальные элементы.
Может ли кто-нибудь объяснить, почему это продолжается?
Обновлено: Я понял ошибку, которую я совершал, благодаря вам, ребята! Я изменил цикл for с
for(WrittenWork w: products)
System.out.println(w1.toString());
System.out.println(w2.toString());
System.out.println(w3.toString());
К
for(WrittenWork w: products)
System.out.println(w.toString());
Это изображение показывает, как все классы связаны
Вот код:
import java.util.*;
public class BookStore
{
public static void main(String[] args)
{
Author a1 = new Author("Malcom Gladwell");
Author a2 = new Author("Steven Johnson");
Author a3 = new Author("Mathias Johansson");
Author a4 = new Author("Evan Ackerman");
Author a5 = new Author("Erico Guizzo");
Author a6 = new Author("Fan Shi");
WrittenWork w1 = new Novel(a1, "What the Dog Saw and other adventures", 503);
WrittenWork w2 = new Novel(a2, "How We Got to Now: Six Innovations That Made the Modern World", 320);
WrittenWork w3 = new Novel(a2, "Everything Bad Is Good For you: How Today's Popular Culture is Actually Making us Smarter", 254);
ArrayList<WrittenWork>products = new ArrayList<>();
products.add(w1);
products.add(w2);
products.add(w3);
for(WrittenWork w: products)
System.out.println(w1.toString());
System.out.println(w2.toString());
System.out.println(w3.toString());
}
}
Почему вы не печатаете w?




for (WrittenWork w: products){
System.out.println(w.toString());
}
Так должно быть:
for(WrittenWork w: products)
System.out.println(w.toString());
}
Вы уже просматриваете все объекты WrittenWork, использование w1, w2, w3 сводит на нет использование цикла for в первую очередь.
Попробуй это:
for (WrittenWork w: products){
System.out.println(w.toString());
}
Вы повторяете ArrayList, но печатаете w1, w2 и w3 на каждой итерации. Как указывали другие, печатайте w в каждой итерации, которая указывает на элемент, соответствующий итерации.
for (WrittenWork w: products){
System.out.println(w.toString());
}
Помимо того, что вы не использовали скобки для правильной идентификации блока for, у вас есть логический недостаток в вашем небольшом фрагменте кода.
Вы написали
the ArrayList keeps printing the first item 3 times and then prints the rest of the items
Это навело меня на мысль, что ваш код на самом деле не отражает того, чего вы на самом деле хотите достичь.
Поначалу это совершенно нормально, не волнуйтесь.
Кажется, вы хотите распечатать все WrittenWork.
Для этого вы использовали цикл (повышенная) for
for (WrittenWork w : products)
но вы никогда не учитывали локальную переменную w.
В фоновом режиме для вас создается Iterator<WrittenWork> (JavaDoc), и на каждой итерации элемент следующий в списке products передается вам через w.
Вам просто нужно использовать эту переменную w, чтобы напечатать все элементы products.Iterator исчерпает себя, и цикл остановится.
Насколько вам известно, этот стиль for-loop
for (WrittenWork w : products) { ... }
эквивалентно
for (Iterator<WrittenWork> iterator = products.iterator(); iterator.hasNext(); ) {
final WrittenWork w = iterator.next();
...
}
Вы можете видеть отмеченное условие iterator.hasNext();.
for(WrittenWork w: products)
System.out.println(w1.toString());
System.out.println(w2.toString());
System.out.println(w3.toString());
}
В режиме выполнения программы это может заставить вас чувствовать себя хорошо, и она работает, но возникает логическая проблема: если вы выберете печать всех объектов с помощью отдельных методов System.out.println, то почему вы использовали for(each)-loop?
Кроме того, вам не нужно вызывать метод toString() неявно и автоматически, если в метод System.out.println передается ссылка на объект
В вашем цикле нет скобок, поэтому выполняется только первый оператор. Почему вы вообще используете цикл, если вы жестко кодируете операторы печати?