【问题标题】:Accessing an object class variable in ArrayList (java)访问 ArrayList (java) 中的对象类变量
【发布时间】:2012-10-09 21:55:54
【问题描述】:

所以,假设我有一门课来描述一本书

   public class Book {
     String name;
     int pages;
     String auother;
     boolean available;
     String rentername;
  }

现在,我设置了一个数组列表来包含我希望在运行期间拥有/添加/删除的未知数量的书籍。 问题是,当我尝试通过索引访问数组列表中的某本书时,我得到了一个错误。

enter code here

ArrayList Books = new ArrayList();
Book bk1 = new Book();
Books.add(bk1);
System.out.println(Books[0]. --->>> won't give me accesses to the 'Book' class variables (name, pages...)

那么,我怎样才能使它成为类变量? 谢谢。

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    ArrayList 是由动态数组支持的 java.util.List 集合的实现。

    这意味着三件事。

    首先,您无需担心调整大小、分配或处理数组中的元素,ArrayList 会为您处理。

    其次,任何需要 List 的方法都不关心实现(您可以传递 LinkedList 代替),它解耦了代码(这意味着您可以更改实现而不会对依赖它的人产生不利影响,因为通过List接口做的合约)

    第三,与List的内容交互,需要使用一种或多种接口访问方式。

    add你已经知道了,但是要获取一个对象,你需要使用getwhich;

    返回此列表中指定位置的元素

    你可能也有兴趣

    当然,还有其他方法,但这些都是立即有用的。

    我也会阅读Collections Trail

    更新示例

    public class Test {
    
        public static void main(String[] args) {
            new Test();
        }
    
        public Test() {
    
            List<Book> listOfBooks = new ArrayList<Book>();
            Book bk1 = new Book();
            listOfBooks.add(bk1);
    
            System.out.println("           bk1 = " + bk1);
            System.out.println("listOfBooks(0) = " + listOfBooks.get(0));
    
        }
    
        public class Book {
    
            String name;
            int pages;
            String auother;
            boolean available;
            String rentername;
    
            @Override
            public String toString() {
                return "Book: name = " + name + "; pages = " + pages + "; available = " + available + "; rentername = " + rentername + "; hashCode = " + hashCode();
            }
    
        }
    }
    

    哪些输出

               bk1 = Book: name = null; pages = 0; available = false; rentername = null; hashCode = 1137551390
    listOfBooks(0) = Book: name = null; pages = 0; available = false; rentername = null; hashCode = 1137551390
    

    【讨论】:

    • 当我使用 get 方法时,我无法访问 book 对象变量(名称、页面等...我只能查看通用对象方法,例如 qeuals/get class/HashCode ...
    • 您遇到的第一个问题是您使用的是List 的vanellia 版本,它接受任何类型的Object,但只会返回Object。您可以通过以下方式解决此问题: 1. 将结果转换回 Book (Book book = (Book)Books.get(0)),但这很危险,应尽可能避免。 2.利用Generics,这基本上限制了List只能处理某些类型的Objects。我已经用一个示例更新了我的帖子,但您可能希望阅读Generics Trail 以了解更多信息
    【解决方案2】:

    使用Listget(int index)方法获取你想要的条目:

    System.out.println(Books.get(0));
    

    您无法使用用于数组的表示法访问 List 的条目。

    顺便说一句:请坚持Java Naming Conventions

    【讨论】:

    • 当我使用 get 方法时,我无法访问 book 对象变量(名称、页面等...我只能查看通用对象方法,例如 qeuals/get class/HashCode ...
    • @user3921 当然不能。它们既不是公开的,也没有 getter/setter 方法。更改/添加这些,您将能够访问它们。
    • 嘿,对不起我的朋友,但是添加公众并没有解决问题,我还附上了一张照片给你们看...i45.tinypic.com/wtswj.jpg
    • @user3921 那是因为你使用了一个无类型的ArrayList。在您的ArrayList 包含Books 的任何地方使用ArrayList&lt;Book&gt;。否则 Java 和 Eclipse 无法知道ArrayList 包含Books,因此无法访问这些属性。 (之后您可以再次将它们设为私有)。
    【解决方案3】:

    您需要创建公共 setter 和 getters 方法来访问字段,并访问您需要的 book 实例

    books.get(index)
    

    【讨论】:

    • 或者,对于纯数据类,将字段公开可能没问题。除非它们进行边界检查或其他验证,否则访问器和修改器将只是此类的样板。
    • 访问器可以在未来使用,也有许多框架可能会在对它们使用时寻找访问器
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多