有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将一个基本变量分配给另一个,而将引用变量分配给另一个

我想了解原语和对象引用变量的行为是如何不同的。我使用了Kathy Sierra的OCA/OCP Java SE7中的以下代码作为示例:

public class VariableTesting {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("a= " + a);

        int b = a;
        b = 30;
        System.out.println("a= " + a + " after change it to b and b is " + b);

        Dimension a1 = new Dimension(5, 10);
        System.out.println("a1.height = " + a1.height);

        Dimension b1 = a1;
        b1.height = 30;

        System.out.println("a1.height= " + a1.height + " after change to b1");
    }
}

在上面的代码中,我在更改b的值之前和之后得到a = 10;的值

基本变量大小写的输出为:

a = 10
a = 10 after change it to b and b is 30

然而,在对象引用变量中,一旦我更改了b1.height = 30;的值,就会得到一个不同的值

参考变量情况的输出为:

a1.height = 10
a1.height = 30 after change to b1

书中提到,在这两种情况下,复制位模式并放置新副本。如果这是真的,那么为什么我们会有不同的行为呢


共 (2) 个答案

  1. # 1 楼答案

    只有一个实例

    当你说

    Dimension b1= a1; // <  assigns reference of a1 to b1.
    

    a1引用的引用地址分配给b1。因此,当您通过b1修改height字段时,您也会修改a1

     b1.height=30; // <  a1.height = 30
    

    创建另一个实例

    如果希望b1成为唯一的引用对象,那么可以使用new

     Dimension b1= new Dimension(a1.width, a1.height); // <  creates a new Dimension
    
  2. # 2 楼答案

    这就是引用和原语之间的根本区别。在这两种情况下,您都会得到实际的,但只有在对象的情况下,您才有机会影响它的任何其他用途的结果

    让我们浏览一下代码

    int a = 10;
    int b = a;
    

    这两项声明如下:

    • 将值10赋给名为a的int标识符
    • a的值分配给名为b的int标识符

    到目前为止,一切顺利。我们不能说ab引用;我们只接受价值观

    如果我们宣布:

    b = 30;
    

    我们的意思是,取30的值并将其分配给标识符b

    在那一点上,我们不会对a做任何事情;它已经包含值10。这就是为什么ab是不同的

    现在,当我们到达物体时,表面上的东西并没有真正改变

    Dimension a1 = new Dimension(5, 10);
    Dimension b1 = a1;
    

    我们将其翻译为:

    • 将带有(int)参数5和10的新维度的实例化值分配给Dimension标识符a1
    • a1的值分配给Dimension标识符b1

    我们仍然在这里分配,因为Java是pass-by-value。更重要的是,在Java中,对象的值仍然是对该对象的引用

    通过上面的例子,a1b1指向同一个实例

    现在,当我们说:

    b1.height = 30;
    

    我们实际上是在说:

    • 将值30分配给通过值b1取消引用的字段height

    我们仍然在这里引用b1的值,它与a1相关。这就是为什么你看到了差异;因为a1b1引用了相同的值(这是相同的引用),所以通过标识符b1进行的任何更改都会通过a1反映出来