创建类存储对象

Posted

技术标签:

【中文标题】创建类存储对象【英文标题】:Create Class Store Objects 【发布时间】:2018-08-10 16:21:43 【问题描述】:

我有一个关于对象和存储它们的初学者问题。我需要创建一个名为 GameEntry 的单独类,其中一个名为 scores 的属性,然后我需要将这些 GameEntry 对象存储在一个数组中。不仅仅是任何数组,尽管它必须是带有方括号的数组:[ ]

奇怪的是,我可以使用ArrayList 让它工作,但使用简单的数组就像不可能完成的任务??有人可以帮忙吗?

class GameEntry 
    int scores;

    GameEntry(int s) 
        scores = s;
    


public class R11ScoreArray 
     public static void main(String[] args) 
        GameEntry[] scoreArray; // declares that scoreArray is an array of
                            // 'GameEntry'
        scoreArray = new GameEntry[4]; // create array of 4 elements
        scoreArray[0] = new GameEntry(10);
        scoreArray[0] = new GameEntry(100);
        scoreArray[0] = new GameEntry(1000);
        scoreArray[0] = new GameEntry(10000);
        for (int i = 0; i < scoreArray.length; i++) 
            System.out.println(Arrays.toString(scoreArray));
        
    

【问题讨论】:

发布阵列的 sn-p。 请向我们展示您尝试过的内容以及您遇到的困难。究竟是什么不工作?您是否研究过如何创建自定义对象以及如何创建数组?对于带有 10 RaceCar 对象位置的数组,它应该类似于 RaceCar[] cars = new RaceCar[10]; 谢谢。但请通过编辑将其包含在您的问题中。 你的预期输出是多少,当前输出是多少?如果有错误消息,它会读取什么内容? 设法编辑我的问题,呸。 【参考方案1】:

说明

我认为您稍微误解了如何使用数组。创建数组的工作方式是这样的

GameEntry[] scoreArray = new GameEntry[4];

这个数组现在可以容纳 4 GameEntry 对象。简称

// Declare
GameEntry[] scoreArray;

// Allocate
scoreArray = new GameEntry[4];

您可以使用它们的索引来设置和访问这些对象,就像这样

// Set the first object, at index 0
scoreArray[0] = new GameEntry(10);

// Set the second object, at index 1
scoreArray[1] = new GameEntry(100);

// Access the first object
System.out.println(scoreArray[0].scores);

// Access the second object
System.out.println(scoreArray[1].scores);

您的打印声明也没有多大意义:

for (int i = 0; i < scoreArray.length; i++) 
    System.out.println(Arrays.toString(scoreArray));

它在每次迭代中再次对整个数组进行字符串化。那么为什么要将它包含在循环中呢?您可能打算迭代数组并手动访问元素。 Arrays.toString 方法已经自行迭代了数组。这就像问4 次同样的问题“完整的数组是什么样子的?”


解决方案

所以你的代码应该看起来像

// Declare and allocate the array
GameEntry[] scoreArray = new GameEntry[4];

// Set elements at indices 0-3
scoreArray[0] = new GameEntry(10);
scoreArray[1] = new GameEntry(100);
scoreArray[2] = new GameEntry(1000);
scoreArray[3] = new GameEntry(10000);

// Iterate the array
for (int i = 0; i < scoreArray.length; i++) 
    // Access the element at index i
    GameEntry currentObject = scoreArray[i];

    // Print some info about the object
    System.out.println("Current object is: " + currentObject);
    System.out.println("It has a score of: " + currentObject.scores);


关于打印对象的注意事项

如果你打印一个类似的对象

// GameEntry@15db9742
System.out.println(currentObject);

它将调用currentObject.toString(),这是每个对象都有的方法(因为它是每个类隐式扩展的Object 类的一部分)。如果您不覆盖此方法,它将回退到 Object 类的默认实现,该类打印类名和一些标识当前 JVM 实例中对象的代码。

以下是覆盖它的方法

class GameEntry 
    // Other stuff
    ...

    @Overwrite
    public String toString() 
        return "GameEntry[score=" + scores + "]";
    

现在语句将像这样打印它

// GameEntry[score=10]
System.out.println(currentObject);

【讨论】:

谢谢伙计。这非常接近工作,但输出有点偏离。它在咳嗽:“当前对象是:GameEntry@15db9742 它的分数:10 当前对象是:GameEntry@6d06d69c 它的分数是:100 当前对象是:GameEntry@7852e922 它的分数是:1000 当前对象是:GameEntry@4e25154f 得分:10000" @KWMuller 这正是我的预期。你期待什么? :) 你对GameEntry@... 的东西感到困惑吗?如果您打印一个对象,它将在该对象上调用toString。如果您没有覆盖此方法,它将回退到类 Object 中所述的默认实现,该实现会打印类的名称和一些标识当前 JVM 实例中对象的代码。 谢谢,伙计。我现在对数组的理解好多了。我们最终到达了那里! xD【参考方案2】:

不确定这是否会对您有所帮助,但我试图让您了解如何将对象存储在数组中。

public static void main(String[] args) 
    // If you know the number of objects you're going to store
    int definedSize = 10;

    // Create your array like this
    Object[] objArray = new Object[definedSize];

    // If you don't then use an ArrayList
    ArrayList<Object> objList = new ArrayList<Object>();

    // And use this method to get an array instead of a list
    objArray = objList.toArray();

【讨论】:

以上是关于创建类存储对象的主要内容,如果未能解决你的问题,请参考以下文章

创建基类对象的向量并将派生类对象存储在其中

如何创建一个可以存储多个对象的arraylist类?

面向对象 之 炮塔游戏(继承,对象存储到列表)

如何在向量中存储多个类的不同对象?

在数据结构中存储对象

Spring 通过注解来存储和读取对象