Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建变量数组_Java_Arrays_Variables - Fatal编程技术网

Java 创建变量数组

Java 创建变量数组,java,arrays,variables,Java,Arrays,Variables,我有一个关于创建变量数组的问题;如果我创建一个整数类型的变量数组,并且在数组外部更改这些变量的值,那么数组内部的值也会得到更新吗?我已经在eclipse中尝试过了,但它似乎不起作用(请参阅下面的代码) 我希望两个输出(num1和nums[0])是相同的,但到目前为止,我经历的是nums[0]保持不变,不会更新,关于如何更新此值的任何提示(无需进入并更新)最受欢迎的是Java的int类型是值类型而不是引用类型,因此当您创建数组时,旧int的值将复制到数组中。因此,更改原始(阵列外部)不会更改阵列内

我有一个关于创建变量数组的问题;如果我创建一个整数类型的变量数组,并且在数组外部更改这些变量的值,那么数组内部的值也会得到更新吗?我已经在eclipse中尝试过了,但它似乎不起作用(请参阅下面的代码)


我希望两个输出(
num1
nums[0]
)是相同的,但到目前为止,我经历的是
nums[0]
保持不变,不会更新,关于如何更新此值的任何提示(无需进入并更新)最受欢迎的是

Java的
int
类型是值类型而不是引用类型,因此当您创建数组时,旧
int
值将复制到数组中。因此,更改原始(阵列外部)不会更改阵列内部的独立副本

为了实现您想要的行为,您可以使用Erwin的解决方案,或者您必须创建自己的包装器类来实现间接寻址的额外值,不幸的是,这相当冗长

class IntWrapper {
    public int value;
    public IntWrapper(int i) {
       value = i;
    }
}

class Main{
public static void main(String[] args) { 
   IntWrapper num1 = new IntWrapper(1);
   IntWrapper num2 = new IntWrapper(2);
   IntWrapper num3 = new IntWrapper(3);

   IntWrapper[] nums = {num1, num2, num3};
   num1.value++; 
   System.out.println(num1.value);
   System.out.println(nums[0].value);
}
}

在Java中,基本类型是按值传递的。当您将
num1
放入数组
nums
中时,创建了一个副本。如果以后更改
num1
,则它对数组中的值没有影响。 对象引用也是通过值传递的,但对象本身不是——它们是通过向对象传递引用来传递的。因此,如果您创建一个表示整数的对象数组,并且可以修改这些对象,那么您可以做您想要做的事情

标准API有一个表示整数的类,称为
java.lang.integer
。但是,它表示一个不可变的整数,因此对您没有任何用处。 在标准API中,还有另一个类称为
java.lang.concurrent.AtomicInteger
。可以修改此类的对象

您可以这样使用它:

AtomicInteger num1 = new AtomicInteger(1);
AtomicInteger num2 = new AtomicInteger(2);
AtomicInteger num3 = new AtomicInteger(3);
AtomicInteger[] nums = {num1, num2, num3};
num1.incrementAndGet();
System.out.println(num1);
System.out.println(nums[0]);

您只需编写
nums[0]++
在数组中增加一个数字。多亏了这一点,我用这个方法创建了一个整数包装器,但是现在如果我有几个单独的类实例,并且想向不同的实例添加不同的值(即,将1添加到num1,从num2中减去1),那么它会对所有三个实例执行此操作,知道如何解决这个问题吗?@cvarza,使用
new
关键字独立创建的此类实例应彼此完全独立。如果使用
IntWrapper a=b
进行复制,则将引用同一对象,因此一个对象中的更改将传播到另一个对象。如果这还不够清楚,请提出一个引用此问题的新问题,并显示一些描述该问题的代码。如果您在此处添加一条链接到新问题的注释,我将查看它。@cvarza,如果您想在当前实现下创建具有相同值的独立副本,您可以执行
IntWrapper a=new IntWrapper(b.value)thx对于您在这一点上的帮助,merlin,我设法找到了一个关于管理单独实例的解决方案(我的另一个问题的链接是您是否可以添加其他信息),谢谢。
AtomicInteger num1 = new AtomicInteger(1);
AtomicInteger num2 = new AtomicInteger(2);
AtomicInteger num3 = new AtomicInteger(3);
AtomicInteger[] nums = {num1, num2, num3};
num1.incrementAndGet();
System.out.println(num1);
System.out.println(nums[0]);