Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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 - Fatal编程技术网

指向另一个对象引用的Java对象引用

指向另一个对象引用的Java对象引用,java,Java,此类ds有两个字段,x和y public class ds { private int x; private int y; public ds(int xx, int yy) { x = xx; y = yy; } public int getX() { return x; } public int getY() { return y; } public void setX(int xx) { x = xx; } public void set

此类
ds
有两个字段,x和y

public class ds
{

private int x;
private int y;

public ds(int xx, int yy)
{
    x = xx;
    y = yy;
}

public int getX()
{
    return x;
}

public int getY()
{
    return y;
}

public void setX(int xx)
{
    x = xx;
}

public void setY(int yy)
{
    y = yy;
}

}
此类
ptrs
使用
ds
打印结果。我注意到无论
int
还是
Integer
ds
中使用,打印输出都是相同的

public class ptrs
{
public static void main(String[] args)
    {
    ds d = new ds(1,2);

    System.out.println("d.x:" + d.getX()); //1
    System.out.println("d.y:" + d.getY()); //2

    //t is an object reference (a pointer) which points to d, which in turn 
    points to the ds object
    ds t = d;

    System.out.println("t.x:" + t.getX()); //1
    System.out.println("t.y:" + t.getY()); //2

    t.setX(3);
    t.setY(4);

    System.out.println("");

    System.out.println("t.x:" + t.getX()); //3
    System.out.println("t.x:" + t.getY()); //4


    System.out.println("d.x:" + d.getX()); //3
    System.out.println("d.y:" + d.getY()); //4

    d.setX(5);
    d.setY(6);

    System.out.println("");

    System.out.println("d.x:" + d.getX()); //5
    System.out.println("d.x:" + d.getY()); //6

    System.out.println("t.x:" + t.getX());  //5
    System.out.println("t.x:" + t.getY());  //6
    }
}
当我在
d
t
上调用set方法时,在任一指针上调用get方法都会得到更新的值。为什么在下一个例子中有明显不同的行为

public class main
    {
    public static void main(String[] args)
        {
        Integer i = new Integer(5);
        Integer a = i;

        System.out.println("i is " + i ); //5
        System.out.println("a is " + a ); //5

        i = new Integer(10);

        System.out.println("i is " + i ); //10 
        System.out.println("a is " + a ); //5
        }
    }
如果我设置一个整数对象引用
I
指向一个值为5的整数对象,然后再引用另一个
a
引用
I
,为什么
a
即使在引用另一个值为10的整数对象后仍然指向5

区别是因为在第一个示例中,我更改了同一对象的字段,但在第二个示例中,我指向了一个新对象?但如果这是原因的话,那为什么会造成不同呢

区别是因为在第一个示例中,我更改了 相同的对象,但在第二个示例中,我指向一个新对象

但如果这是原因的话,那为什么会造成不同呢

因为这样很有用

区别是因为在第一个示例中,我更改了 相同的对象,但在第二个示例中,我指向一个新对象

但如果这是原因的话,那为什么会造成不同呢


因为这样很有用?

因为在第一个示例中只有一个对象。即使您正在更改x和y的值,它仍然是相同的单个对象

在第二个示例中,有两个对象。我希望下面的图片能把它弄清楚


因为在第一个示例中只有一个对象。即使您正在更改x和y的值,它仍然是相同的单个对象

在第二个示例中,有两个对象。我希望下面的图片能把它弄清楚

您的线路:
i=新整数(10)
将一个全新的对象指定给i,覆盖其以前的值。新对象完全独立于先前由i和a引用的对象。 因此,我不再引用a-i引用的对象,而a引用了完全不同的对象,它们(正如您所期望的)不会相互作用。

您的行:
i=新整数(10)
将一个全新的对象指定给i,覆盖其以前的值。新对象完全独立于先前由i和a引用的对象。
因此,我不再引用a-i引用的对象,而a引用的是完全不同的对象(正如您所期望的那样),它们不会相互作用。

您能更详细地解释一下吗?开发人员是如何让它以这种方式变得有用的?它给了您一个机会,让您有时拥有不同的对象,这些对象不会被另一个对象上的修改所修改,而这对您是有帮助的。其他时候,代码的其他部分共享一个对象,当他们修改它时,代码的所有其他部分都会考虑这个修改。我仍然想了解这是如何工作的,比如说,在地址级别。您能给我一个Java寻址的概述吗?如果
i
是一个指针,它保存第一个整数对象的地址,
a
保存
i
的地址,那么如果
i
中包含的地址发生了变化,那么我认为在通过引用
a
获取对象时也应该反映出这种变化。你还没有解释你所说的是如何或为什么起作用的。我觉得你把指针和指针的指针搞混了。在您的示例中,i和a都是Integer类型。他们是同一类型的,没有什么不同。所以他们不会有什么不同。如果一个是指向最终对象的指针,那么另一个也是指向最终对象的指针,而不是指向指针的指针。当i是一个包含整数地址的指针,并且你将i赋值给a,那么a是一个包含与i相同地址的指针。你让它包含和我一样的东西。好的,这很有意义。你能解释得更详细些吗?开发人员是如何让它以这种方式变得有用的?它给了您一个机会,让您有时拥有不同的对象,这些对象不会被另一个对象上的修改所修改,而这对您是有帮助的。其他时候,代码的其他部分共享一个对象,当他们修改它时,代码的所有其他部分都会考虑这个修改。我仍然想了解这是如何工作的,比如说,在地址级别。您能给我一个Java寻址的概述吗?如果
i
是一个指针,它保存第一个整数对象的地址,
a
保存
i
的地址,那么如果
i
中包含的地址发生了变化,那么我认为在通过引用
a
获取对象时也应该反映出这种变化。你还没有解释你所说的是如何或为什么起作用的。我觉得你把指针和指针的指针搞混了。在您的示例中,i和a都是Integer类型。他们是同一类型的,没有什么不同。所以他们不会有什么不同。如果一个是指向最终对象的指针,那么另一个也是指向最终对象的指针,而不是指向指针的指针。当i是一个包含整数地址的指针,并且你将i赋值给a,那么a是一个包含与i相同地址的指针。你让它包含和我一样的东西。好吧,这是有道理的。我知道Java是按值传递的。据我所知,函数a中的一个变量,当传递给函数B并由函数B在本地操作时,然后在返回B并在a中继续执行后保持其原始值。我认为这些示例可能不同,因为我在第一个示例中关注的问题在调用集合之前不处理值