【问题标题】:Setting values to an Array of objects将值设置为对象数组
【发布时间】:2015-03-29 11:32:18
【问题描述】:

我正在修改我的 Java 书籍,以确保我对对象和 Java 基础知识有深入的了解。我偶然发现了我正在阅读的书中的这段代码Head First: Java 2nd edition (2005)

 class Book {   

     String title;
     String author; 

 }

 class Main {

    public static void main(String args[]) {    

        int x = 0;      

        Book[] myBooks = new Book[3];
        myBooks[0] = new Book();
        myBooks[1] = new Book();
        myBooks[2] = new Book();
        myBooks[0].title = "Example title xx";
        myBooks[1].title = "Example title cc";
        myBooks[2].title = "Example title yy";
        myBooks[0].author = "Example author xx";
        myBooks[1].author = "Example author cc";
        myBooks[2].author = "Example author yy";    

        while (x < 3) {     

            System.out.print(myBooks[x].title);
            System.out.print(", author ");
            System.out.println(myBooks[x].author);
            x = x + 1;  

        }       
    }   
}

我不太明白myBooks[0].title = "Example title xx"的语法 我承认我对数组及其工作方式还不太熟悉,但是循环遍历数组并使用 setter 方法设置所有对象字段不是更好的做法吗?

我认为是这种情况

根据我有限的理解,这种为这些字段分配值的特殊方法与这两个类的范围有关。与您使用静态方法名称的方式相同,而不是首先创建它们各自类的对象,而是使用静态变量。

这看起来很琐碎,但对我来说理解和掌握这个想法很重要。我希望你能帮我清理一下。

【问题讨论】:

  • isn't it a better practice to loop through the array and set all the object fields with setter methods? 不,在这种情况下不是。您需要检查迭代变量(例如for (int i = .....) 中的i)以了解您当前所在的索引,以设置正确的值。当前使用修复索引的方式在这里更简洁。

标签: java arrays object


【解决方案1】:

首先,让我们在没有数组的情况下重写你的程序:

Book myBooks0, myBooks1, myBooks2;
myBooks0 = new Book();
myBooks1 = new Book();
myBooks2 = new Book();
myBooks0.title = "Example title xx";
myBooks1.title = "Example title cc";
myBooks2.title = "Example title yy";
myBooks0.author = "Example author xx";
myBooks1.author = "Example author cc";
myBooks2.author = "Example author yy";  

如果您了解引用 cusom 类的 Java 变量,这一点都不神秘。

接下来,让我们回到你的数组:

Book[] myBooks = new Book[3];

它将上面的三个命名变量替换为一个数组变量,所以现在不写myBooksX,而是写myBooks[X]

这就是两者之间的大部分区别。数组的优点是X 可以是变量或整数表达式,计算结果为 0、1 或 2,而对于单个变量,数字必须是硬编码的。

【讨论】:

  • 非常感谢。我应该指出我的主要问题是“。”部分。但是你向我解释了它的要点。你有什么资源可以让我了解更多吗?
  • @Lotix 你拥有的这本书是一个很好的资源。加深您对该主题的理解的一个好方法是在章节之后做练习,而不看答案,将您的代码与他们的代码进行比较,并理解差异。
【解决方案2】:
  1. myBooks[0].title = "Example title xx"
    

    将字符串分配给数组中第一个元素的title字段

  2. 循环遍历数组并使用setter方法设置所有对象字段不是更好的做法吗?

    一般来说是的。

【讨论】:

    【解决方案3】:

    当你使用数组时,你应该理解这个概念。

    Book[] mybooks = new Book[3]

    这意味着会有一个 Book 类型的数组。 Book[0] 表示,这是对内存中真实对象的引用(就像对对象的遥控器一样)。

    所以当你调用 mybook[0].title 时,这意味着你正在调用 Book[0] 的 title 方法(就像按下 Book[0] 遥控器上的按钮标题一样。

    【讨论】:

      猜你喜欢
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2019-02-22
      相关资源
      最近更新 更多