【问题标题】:Adding objects to ArrayList [duplicate]将对象添加到 ArrayList [重复]
【发布时间】:2016-08-10 20:13:09
【问题描述】:

这是我关于 stackoverflow 的第一个问题。我通常可以自己找到答案,但我在这个问题上遇到了麻烦。我有 2 个对象,“Book”和“Periodical”。这些是“出版物”类的子类。现在,我正在尝试将 3 个“Book”实例和 3 个“Periodical”实例添加到 ArrayList。我很难弄清楚如何做到这一点。

使用此当前代码,我收到错误“找不到适合 add(Book,Book,Book,Periodical,Periodical,Periodical) 的方法。

这是当前代码:

import java.util.ArrayList;
import java.util.Date;

public class DriverProgram {
  public static void main(String[] args) {
    // Instantiate 3 instances of each object.
    Book book1 = new Book(1234, 1, "James", 100, "Hello", "Berkwood Inc.",     new java.util.Date(), "History");
    Book book2 = new Book(2345, 2, "Ralph", 200, "Goodbye", "Shackles Co.", new java.util.Date(), "English");
    Book book3 = new Book(3456, 3, "Julia", 300, "Hello Again", "Trustin Inc.", new java.util.Date(), "History");
    Periodical periodical1 = new Periodical("Daily", "Dylan", "History 101", "History Inc.", new java.util.Date(), "History");
    Periodical periodical2 = new Periodical("Weekly", "Jannette", "Mathematics 101", "Mathematics Inc.", new java.util.Date(), "Mathematics");
    Periodical periodical3 = new Periodical("Monthly", "Patricia", "Science 101", "Science Inc.", new java.util.Date(), "Science");

    // Create an array list of the Publication class type, and add the objects to it.
    ArrayList <Publication> publications = new ArrayList<Publication>();
    publications.add(book1, book2, book3, periodical1, periodical2,     periodical3);

    // Pass the array list to a method to loop through it and display the     toString methods.
    displayObjects(publications);
  } // End of main

  static void displayObjects (ArrayList<Publication> publications) {
    // Loop through array list and display the objects using the toString     methods.
  for (Publication p : publications) {
      System.out.print(p.toString());
    } // End of for each loop
  } // End of displayObjects
} // End of DriverProgram class

我也尝试过改变:

publications.add(book1, book2, book3, periodical1, periodical2, periodical3);

到这里:

publications.add(book1);
publications.add(book2);
publications.add(book3);
publications.add(periodical1);
publications.add(periodical2);
publications.add(periodical3);

这使我的程序摆脱了编译器错误,但随后它只打印了“periodical3”对象 6 次。我不确定我做错了什么。有什么建议?先感谢您! :)

编辑:

这是我的书课:

public class Book extends Publication{
  private static int isbn = 0;
  private static int libraryOfCongressNbr = 0;
  private static String author = "";
  private static int nbrOfPages = 0;

  // Constructor for Book class with parameters for each attribute.
  public Book(int newISBN, int newLibraryOfCongressNbr, String newAuthor,     int newNbrOfPages, String newTitle, String newPublisher, java.util.Date     newPublicationDate, String newSubject) {
    super(newTitle, newPublisher, newPublicationDate, newSubject);
    isbn = newISBN;
    libraryOfCongressNbr = newLibraryOfCongressNbr;
    author = newAuthor;
    nbrOfPages = newNbrOfPages;
  }

/////////////////////////////////////////////////////// Getters     ///////////////////////////////////////////////////////

  int getISBN() {
    return isbn;
  }

  int getLibraryOfCongressNbr() {
    return libraryOfCongressNbr;
  }

  String getAuthor() {
    return author;
  }

  int getNbrOfPages() {
    return nbrOfPages;
  }

/////////////////////////////////////////////////////// Setters     ///////////////////////////////////////////////////////

  void setISBN(int newISBN) {
    isbn = newISBN;
  }

  void setLibraryOfCongressNbr(int newLibraryOfCongressNbr) {
    libraryOfCongressNbr = newLibraryOfCongressNbr;
  }

  void setAuthor(String newAuthor) {
    author = newAuthor;
  }

  void setNbrOfPages(int newNbrOfPages) {
    nbrOfPages = newNbrOfPages;
  }

  //toString method for Book class
  public String toString () {
    StringBuilder result = new StringBuilder();
    result.append("\nISBN: " + isbn + "\n");
    result.append("\nPublisher: " + libraryOfCongressNbr + "\n");
    result.append("\nAuthor: " + author + "\n");
    result.append("\nNumber of Pages: " + nbrOfPages + "\n");
    result.append("---------------------------------------------------------    ");
    return super.toString() + result.toString();
  } // End of toString
} // End of Book class

我的 Periodical 类是相同的,但这是我的 Publication 类:

import java.util.Date;

public abstract class Publication {

  // Data fields.
  private static String title = "";
  private static String publisher = "";
  private static java.util.Date publicationDate;
  private static String subject = "";

  // Constructor for Publication class with parameters for each attribute.
  public Publication(String newTitle, String newPublisher, java.util.Date     newPublicationDate, String newSubject){
    title = newTitle;
    publisher = newPublisher;
    publicationDate = newPublicationDate;
    subject = newSubject;
  }

/////////////////////////////////////////////////////// Getters     ///////////////////////////////////////////////////////

  String getTitle() {
    return title;
  }

  String getPublisher() {
    return publisher;
  }

  java.util.Date getPublicationDate() {
    return publicationDate;
  }

  String getSubject() {
    return subject;
  }

/////////////////////////////////////////////////////// Setters     ///////////////////////////////////////////////////////

  void setTitle(String newTitle) {
    title = newTitle;
  }

  void setPublisher(String newPublisher) {
    publisher = newPublisher;
  }

  void setPublicationDate(java.util.Date newPublicationDate) {
    publicationDate = newPublicationDate;
  }

  void setSubject(String newSubject) {
    subject = newSubject;
  }

  //toString method for Publication class
  public String toString () {
    StringBuilder result = new StringBuilder();
    result.append("\nTitle: " + title + "\n");
    result.append("\nPublisher: " + publisher + "\n");
    result.append("\nPublication Date: " + publicationDate + "\n");
    result.append("\nSubject: " + subject + "\n");
    return result.toString();
  } // End of toString
} // End of Publication class

如果您还需要什么,请告诉我!

EDIT x2:抱歉,我发现我的帖子已经很长了。

所以我已经从我的类变量或我在代码中调用它们的“数据字段”中删除了所有“静态”关键字。然后我把我的代码改回了这个代码:

ArrayList <Publication> publications = new ArrayList<Publication>();
publications.add(book1);
publications.add(book2);
publications.add(book3);
publications.add(periodical1);
publications.add(periodical2);
publications.add(periodical3);

而且它有效!它按应有的方式执行!我只是一个问题,因为这段代码似乎不起作用:

publications.add(book1, book2, book3, periodical1, periodical2,     periodical3);

有没有一种更短的方法可以将所有对象添加到 ArrayList 中而不是一个一个地进行?

【问题讨论】:

  • Publication 类(及其子类)内的所有字段中删除static
  • 这是相当的猜测:)。不过可能是真的。你能发布你的PublicationBook课程吗?
  • 我已经编辑了我的问题以包括我的出版物和书籍类。另外,对于任何“nooby”错误,我深表歉意。我对整个“静态”的事情还是很不确定。

标签: java oop object arraylist foreach


【解决方案1】:

如果我对问题的理解正确,您有 6 个Publication 对象,而您只看到最近创建的对象的值。

这很可能是因为您有 static class 变量而不是 instance 变量。

例如

class A {
    static int x; // class variable
    int y;        // instance variable

    public A(int val) {
        x = val; // All 'A' classes now have x = val;
        y = val; // Only 'this' class has y = val;
    }
}

如果我要运行它

A a1 = new A(4);
A a2 = new A(5);
System.out.println(a1.x);

然后我会看到它打印 5 而不是 4,它描述了您所看到的场景,因为您已将 Publication 类中的所有变量分配给您在上次调用 new Periodical 期间使用的变量。

如果您希望类的多个实例具有自己的值,则解决方案是不要使用static 变量。

【讨论】:

  • 我明白你在说什么,这是有道理的!所以,我已经从出版物、期刊和书籍中的所有变量中摆脱了“静态”键盘。不过,我仍然遇到相同的编译器错误。
  • 我收回了,这确实解决了问题!非常感谢!我再次编辑了我的问题。
猜你喜欢
  • 2016-10-31
  • 2012-12-20
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多