我写了以下代码。它运作得很好,但我有一个问题(所以我不会炸掉任何未来的添加物)。这是代码:
public class MoreStuff extends javax.swing.JFrame {
// Globals
int quiz[][]; // Used for Quiz subroutines
...
private void btnGetQuizActionPerformed(java.awt.event.ActionEvent evt) {
Functions fns = new Functions();
String strout;
int i = 0;
// Get the quiz
quiz = fns.GetQuiz();
fns.GetQuiz()完美地返回一个二维数组。
我的问题是:在类级别声明了一个多维数组,当计算机执行quiz = fns.GetQuiz时,我是否通过了一个对象,还是只复制了一个引用?
答案 0 :(得分:2)
让我们说GetQuiz()
的实施很简单:
public int[][] GetQuiz() {
int[][] someArray = new int[10][];
return someArray;
}
行int[][] someArray = new int[10][];
在堆上分配一个数组,并将该对象的引用分配给someArray
。
当方法GetQuiz()
完成执行时,唯一的东西"被销毁"是someArray
,它只是对数组的引用。数组本身存在于堆上,只有在没有对数组的引用时才有资格进行垃圾回收。
在您的示例中,因为引用的副本已分配给quiz
变量,即使someArray
被销毁,您仍然有quiz
个引用指向数组,所以垃圾收集器不会试图破坏数组。
我认为您可能会发现此主题中的信息很有用:Stack and Heap memory in Java。
答案 1 :(得分:0)
在您的计划中,quiz
即使在执行btnGetQuizActionPerformed()
后也会保留其值,因为它会收到fns
的引用副本。