我真的不想在网上问这个问题,但我自己弄不明白。当我添加一个新对象时,数组中的所有对象都不断收到“更新”
我正在编写一个Android应用程序,以跟踪一些卡丁车耐力赛的战略(管理驾驶员变化)。我设置了一个Driver对象和一个开始时间(Integer [2]。索引0是小时,索引1是分钟)。对于每个Stint对象(=两个驱动程序更改之间的竞争部分),我设置一个Driver对象和一个开始时间。 每一个stint将被放入一个Stint数组中。
在创建一个新的Stint对象(并将其放入数组的下一个点)后,我转到数组的前一个元素并将其结束时间设置为(新对象的)开始时间,这是构造函数新stint的论点。因此,新stint的startTime =旧stint的结束时间。有道理,对吗?我需要这个来计算持续时间。
但这里是问题: 每次我创建一个新的Stint对象以前的对象的所有开始时间将被覆盖到新的时间。所以当第一个时间点在10:00开始,第二个在10:35开始时,第一个开始时间也是突然的10:35。
我认为这是某种基于参考的问题,但我不理解它。我传递给一个新的Stint对象的Driver对象不会被改变 - 只有开始时间!
这是第一个stint(=比赛开始)的方法。 pickup时间来自Android TimePicker对话框。 cDI - > currentDriverIndex 此时stintIndex为0。
public void createFirstStint(String driver, Integer[] pickedTime) {
for (int i = 0; i < AMOUNTOFDRIVERS; i++) {
if (driver.equalsIgnoreCase(driverArray[i].getName()))
this.cDI = i;
}
driverArray[cDI].setDriving(true);
driverOverviewArray[cDI].setTextColor(Color.GREEN);
Stint stint = new Stint(driverArray[cDI], pickedTime);
stintArray[stintIndex] = stint;
}
这是每个其他stint的方法。基本上是一样的。 pDI - > previousDriverIndex。 这里我创建一个新的Stint对象并放入数组的下一个点(stintIndex ++)。 之后,我转到前一个数组元素[stintIndex -1]并设置结束时间。这有效,但开始时间也会被覆盖。
private void createRegularStint(String driver, Integer[] pickedTime) {
stintIndex++;
pDI = cDI;
for (int i = 0; i < AMOUNTOFDRIVERS; i++) {
if (driver.equalsIgnoreCase(driverArray[i].getName()))
this.cDI = i;
}
driverArray[pDI].setDriving(false);
driverArray[cDI].setDriving(true);
Stint stint = new Stint(driverArray[cDI], pickedTime);
stintArray[stintIndex] = stint;
stintArray[stintIndex - 1].setEnd(pickedTime, savePrevStintStartTime); // Sets
// also
// the
// calculated duration
int durationOfLastStint = stintArray[stintIndex - 1]
.getDurationMinutes();
driverArray[pDI].setTimeDriven(durationOfLastStint);
race.addRaceTime(durationOfLastStint);
updateCards();
String s = "";
for (int i = 0; i <= stintIndex; i++) {
s += "Stint " + i + "| Start: "
+ timeMaker(stintArray[i].getStart()) + " Ende: "
+ timeMaker(stintArray[i].getEnd()) + " Fahrer: "
+ stintArray[i].getDriver().getName() + "\n";
}
这是具有当然的所有制定者&干将进站类。 我用999来初始化结束时间,但那只是对我的一些干扰。
public class Stint {
public Driver driver;
public Integer[] start;
public Integer[] end;
public int durationMinutes;
public Stint(Driver driver, Integer[] start) {
this.driver = driver;
this.start = start;
this.end = new Integer[2];
end[0] = 999;
end[1] = 999;
}
/*
* ************************************************
*/
public void calcStintDuration(Integer[] savePrevStintStartTime) {
int minutes;
minutes = end[1] - savePrevStintStartTime[1];
if (minutes < 0)
minutes *= (-1);
this.durationMinutes = minutes;
}
/*
* GETTER & SETTER*********************************
*/
public void setEnd(Integer[] end, Integer[] savePrevStintStartTime) {
this.end = end;
}
public Driver getDriver() {
return driver;
}
public Integer[] getStart() {
return start;
}
public Integer[] getEnd() {
return end;
}
public int getDurationMinutes() {
return durationMinutes;
}
public void setDurationMinutes(int durationMinutes) {
this.durationMinutes = durationMinutes;
}
/*
* ************************************************
*/
}
例如: 当我输入5对不同的他被派驻过(14:00,14点25分,14时39; 15:00,15:15),然后所有先前滨鹬对象将具有开始时间15:15,尽管我在创作之后从未碰过它们。即使当我将Stint类的“开始”变量标记为final时,这种情况仍在继续。
对不起,我不知道为什么这不会做我想做的事情。我也一步一步跟踪调试器,但不知道发生哪部分代码。我希望你能帮助我。
谢谢!
你并没有像你认为的那样添加一个新对象。 – 2014-10-30 14:25:44
,因为它是同一个对象... – Selvin 2014-10-30 14:28:06
欢迎使用java编程。您正在为阵列中的每个元素分配相同的对象引用。这意味着数组中的每个元素都“指向”同一个对象。 – DwB 2014-10-30 14:33:39