【问题标题】:Using an existing array in another class在另一个类中使用现有数组
【发布时间】:2015-04-29 11:27:45
【问题描述】:

让我们改变我提出问题的方式。为了在类中构造对象,我们还可以使用其他一些变量。考虑这个例子:

public class Foo {
    int X1;
    int X2;
    public Foo(int a) {
        int[] array=new int[4];
        // ...
    }
}

如果我们创建这个类的 2 个对象,每个对象将有 2 个变量,总共将占用 4 个整数变量的内存。我关心的是专用于构造函数内定义的整数数组的内存。创建多个对象时如何分配内存?

谢谢,

【问题讨论】:

  • 没有代码可显示? ...我想您可能想要的是在中性类中定义一个常量数组(即某个类包含您的程序使用的常量,仅此而已)。但如果没有代码,这只是一个猜测。
  • 如果您不复制数组而只传递引用,那么唯一的开销将是第二类中对该数组的引用(通常为 4 个字节)
  • 在 StackOverflow 上,包含一个简短的、独立的、可编译的示例始终是一种很好的做法。话虽这么说,你用你的数组做什么?

标签: java pass-by-reference


【解决方案1】:

回答你的第一个问题,是的。如果你在一个类的main 方法中创建一个数组,然后在另一个类的构造函数中再次创建相同的数组,那么内存中就会有该数组的两个副本。更重要的是,如果你以后修改一个副本,另一个副本将不会被修改。

解决问题的最佳方法是将数组作为参数传递给构造函数。然后,您将能够访问(甚至修改)原始数组的元素。例如:

public class Driver{
    public static void Main(String[] args){
        int[] array = {1, 2, 3};
        CustomObject otherObject = new CustomObject(array);
    }
}

//And, in a different file....
public class CustomObject{
    public CustomObject(int[] array){
        int x = array[0];
        //etc..
    }
}

【讨论】:

    【解决方案2】:

    如果你有两个对同一个对象的引用,就不会有任何无用的内存使用。 为了更好地了解它是如何工作的,请查看difference between stack and heap memory in Java

    (基本上你的main方法中的数组和类的构造函数中定义的数组指向同一个内存区域)

    【讨论】:

    • 基本上,你在main方法中的数组和类的构造函数中定义的数组指向同一个内存区域是错误的。如果一个数组在main方法中定义,在类的构造函数中也定义,那么它被定义两次,因此指向两个不同的内存位置。但是,如果传递了对原始数组的引用,那么是的,它们引用了相同的内存区域。
    • 对语义感到抱歉,伙计...但是重点还是一样:没有浪费内存
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多