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

时间:2019-01-08 13:08:47

标签: 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 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
    }
}

当我在dt上调用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即使在我使i引用另一个值为10的Integer对象之后,仍然指向5?

区别在于,在第一个示例中,我更改了同一对象的字段,但是在第二个示例中,我指向了一个新对象?但是,如果那是原因,那为什么会引起变化呢?

3 个答案:

答案 0 :(得分:3)

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

在第二个示例中,有2个对象。我希望下面的图片能将其清除。

image

答案 1 :(得分:0)

  

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

  

但是如果那是原因,那为什么会引起差异??

因为那样有用?

答案 2 :(得分:0)

您的专线:
i = new Integer(10);
将一个新对象分配给i,覆盖其先前的值。新对象完全独立于先前由i和a引用的对象。 因此,我不再引用由-引用的对象,然后再引用完全不同的对象(如您期望的那样),它们不会相互作用。