我今天只是注意到奇怪的行为,即使我已经用Java写了2年。 这里看看我的代码,
public static void main() {
Lorem lo = new Lorem("abc", 2);
LinkedList<Lorem> lim = new LinkedList<>();
lim.add(lo);
LinkedList<Lorem> lid = new LinkedList<>();
lo.tf++;
lid.add(lo);
System.out.println("in list lim: " + lim.get(0).term + " " + lim.get(0).tf);
System.out.println("in list lid: " + lid.get(0).term + " " + lid.get(0).tf);
}
class Lorem {
public String term;
public int tf;
public Lorem(String term, int tf) {
this.term = term;
this.tf = tf;
}
}
结果是这样的:
in list lim: abc 3
in list lid: abc 3
是的,那是相同的对象,添加到不同的列表中。一个列表保存对象,当它的状态是term =&#34; abc&#34;,tf = 2.另一个保存对象当term =&#34; abc&#34;并且tf = 3.最后,您可以看到每个列表的打印值。 令人惊讶的是,lim中的物体lo与盖子中的lo具有完全相同的值。即使我没有同步它们。 我的问题是:为什么Java会自动更新(同步)这样的其他列表?如何禁用该行为?
答案 0 :(得分:1)
这并不奇怪,我想知道你是如何在2年的编程中发现的。
Java通过引用工作。所以你在列表中存储的不是一个对象,而是一个指向堆中某处的实际分配对象的引用,就好像你的LinkedList
只包含一个Lorem的内存地址。
由于您要向两个列表添加相同的引用,因此两个引用都将指向相同的Lorem
实例(在技术上不包含在两个LinkedList
中的任何一个中,因为它们只包含对Private Sub txtmRate_TextChanged(sender As Object, e As EventArgs) Handles txtmRate.TextChanged
txtmRate.Text = Format(CDbl(txtmRate.Text), "#,##0.00")
End Sub 'For Textbox Change
Private Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click
If txtPos.Text = "" Or txtDept.Text = "" Or txtmRate.Text = "" Then
MessageBox.Show("Please fill up all the details!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
Else
If MessageBox.Show("Do you really want to add this new data?", "Save!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) = vbYes Then
sqlqry = "INSERT INTO tblPosition(WorkPosition,Department,MonthlyRate) VALUES (@wPos,@Dept,@mRate)"
Try
ConnDB()
cmd = New OleDbCommand(sqlqry, cnn)
cmd = cnn.CreateCommand
With cmd
.Connection = cnn
.CommandText = sqlqry
.CommandType = CommandType.Text
.Parameters.AddWithValue("@wPos", OleDbType.VarWChar = 50).Value = txtPos.Text
.Parameters.AddWithValue("@Dept", OleDbType.VarWChar = 50).Value = txtDept.Text
.Parameters.AddWithValue("@mRate", OleDbType.Currency = 10).Value = txtmRate.Text
.ExecuteNonQuery()
End With
MessageBox.Show("New Data successfully added!", "Save!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
RefreshData()
cmd.Dispose()
ctrl_clear()
Catch ex As Exception
MsgBox(ex.Message)
Finally
If cnn.State = ConnectionState.Open Then
cnn.Close()
End If
End Try
End If
End If
End Sub 'For Saving Record
的引用它)。
如果要存储两个不同的元素,则需要分配一个新对象(并可能复制/传输状态)。