java - 将一个原始变量分配给另一个变量与将引用变量分配给另一个变量

标签 java primitive-types object-reference

我想了解原始变量和对象引用变量的行为有何不同。我使用 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

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

最佳答案

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

让我们看一下代码。

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 实例化值分配给 Dimension 标识符 a1
  • a1 的值分配给 Dimension 标识符 b1

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

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

现在,当我们声明这一点时:

b1.height = 30;

我们实际上是在说:

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

这里我们仍然引用 b1 的值,它与 a1 相关联。这就是为什么你会看到差异;因为 a1b1 引用相同的值(即相同的引用),因此通过标识符 b1 所做的任何更改都会通过 反射(reflect)出来>a1.

关于java - 将一个原始变量分配给另一个变量与将引用变量分配给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31283287/

相关文章:

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 为什么我们首先需要 isPrimitive() ?

c# - 为什么我不能直接访问已分配给 WinForms Control.Tag 属性的自定义对象的属性?

objective-c - 如何为对象指针指针(id *)选择 ARC 桥接说明符?

java - 类作为变量类型

java - 多态性和 Object 类

java - 使用反射调用类内部的构造函数

java - 如何删除 TextView 中两个相同字符串值之一?

java - 如何检查一个类是否代表特定的原始类型

c++ - 将 int 放入 char 数组中是否需要放置 new 合法?