首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中指向对象是如何工作的?

问在java中指向对象是如何工作的?
EN

Stack Overflow用户
提问于 2016-02-18 04:41:44
回答 4查看 1.5K关注 0票数 0

因此,假设我有两个数组定义如下:

代码语言:javascript
复制
int[] a = {1,2,3};
int[] b = a;

a[1] = 35; // b[1] becomes 35
b[0] = -5; // why would a[0] become -5?

因此,我可以推断,更改a中的值会自动更改b (b指向a)中的值。但是,如果我改变了b中的值,它为什么会影响a?这难道不像a指向b(它们是可互换的)吗?

我对这一概念感到困惑,希望得到一些澄清。如有任何建议,将不胜感激。谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-18 05:06:10

我们来做个类比吧。您创建的对象(如数组)就像气球一样。变量(a和b)就像孩子一样。孩子们可以拿着一个带绳子的气球。这个字符串就是我们所说的引用。另一方面,一个气球可以由多个孩子持有。

在代码中,您创建了一个气球,即数组{1, 2, 3}。让一个叫a的孩子抱着它。现在,您可以告诉子a修改数组中的项,因为子a持有它。

在第二行中,您告诉另一个子b持有a持有的气球,如下所示:

代码语言:javascript
复制
int[] b = a;

现在a和b实际上持有相同的气球!

当你这样做时:

代码语言:javascript
复制
a[1] = 35;

a持有的气球不仅改变了,b持有的气球也改变了。因为a和b拿着同样的气球。

当你这样做时,也会发生同样的事情:

代码语言:javascript
复制
b[0] = -5;

这就是Java中引用类型的工作方式。但请注意,这不适用于原语类型,如int或float。

例如,

代码语言:javascript
复制
int a = 10;
int b = a;
b = 20; //a is not equal to 20!!!
票数 1
EN

Stack Overflow用户

发布于 2016-02-18 04:51:28

在创建变量int[] a = {1,2,3};时,可以使用括号{},就像new int[n] java为这些值分配足够的内存,现在使用内存中的地址的a引用。

然后,当您创建新变量int[] b = a;时,并不是将内存分配给该变量b,而是b引用了a引用的相同地址。

现在,当您在a或b中更改某些内容时,更改将发生在这两个变量引用的地址上,并将由两个变量反映出来。

票数 1
EN

Stack Overflow用户

发布于 2016-02-18 05:07:21

因为Java被认为是引用对象。

代码语言:javascript
复制
int[] b = a;    // variable 'b' points same memory location with 'a'

如果要复制所有值,请在下面编写代码

代码语言:javascript
复制
@Test
public void arrayCopy1() {
    int[] a = {1, 2, 3};
    int[] b = a;

    System.out.println(a); //Point [I@64a294a6
    System.out.println(b); //Point [I@64a294a6

    printArrayValues(a);   //[1,2,3]
    printArrayValues(b);   //[1,2,3]
    a[0] = 10;
    printArrayValues(a);   //[10,2,3]
    printArrayValues(b);   //[10,2,3]
}

@Test
public void arrayCopy2() {
    int[] a = {1, 2, 3};
    int[] b = Arrays.copyOf(a, a.length);

    System.out.println(a); //Point [I@64a294a6
    System.out.println(b); //Point [I@7e0b37bc

    printArrayValues(a);   //[1,2,3]
    printArrayValues(b);   //[1,2,3]
    a[0] = 10;
    printArrayValues(a);   //[10,2,3]
    printArrayValues(b);   //[1,2,3]
}

private void printArrayValues(int[] arr) {
    System.out.print("[");
    for(int i = 0 ; i < arr.length ; i++) {
        System.out.print(arr[i]);
        if (i != arr.length-1)
            System.out.print(",");
    }
    System.out.println("]");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35473009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档