当前位置: 首页 > 面试题库 >

将一个原始变量分配给另一个原始变量,而将参考变量分配给另一个

刘向阳
2023-03-14
问题内容

我想了解原始和对象引用变量的行为方式不同。我以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");
    }
}

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

基本变量case的输出为:

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分配给名为的int标识符a
  • 将的值分配a给名为的int标识符b

到目前为止,一切都很好。我们在哪儿都说不出这ab;我们只取价值观。

如果我们声明:

b = 30;

我们是说 取值30并将其分配给标识符b

a那时我们什么也没做。它已经包含值10。这就是为什么ab有所不同。

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

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

我们将其翻译为:

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

我们仍然 在这里分配
,因为Java是按值传递。这里的缺点是,在Java中,对象的值仍然是对该对象的引用。

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

现在,当我们声明以下内容时:

b1.height = 30;

我们实际上是在说:

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

我们仍指的是b1此处与绑定的值a1。这就是为什么您看到差异的原因;因为a1b1引用相同的值(即相同的引用),所以通过标识符完成的任何更改都会通过b1反映出来a1



 类似资料:
  • 问题内容: 第一个System.out打印 2 并且应该打印,而第二个System打印 65 。我已经用这种语言编程了一年多了,据我所知这是不可能发生的!有什么帮助吗? 上面的代码在两行上都显示 9 。 问题答案: 当你这样做,之前仅仅是一个参考阵列, NO 新阵列已创建并分配给。因此,当您查看自己的价值时,基本上就是查看的价值,反之亦然。只是的别名。这就是为什么在第二张照片中您得到65。 检查该

  • 问题内容: 我在Javascript中有一组全局计数器变量: 等等 然后,我有了一个Javascript函数,该函数接受一个映射到这些全局计数器的“索引”数字。在此函数内部,我需要使用传递给该函数的“索引”值来读写这些全局计数器。 我希望它如何工作的示例,但当然根本不起作用: 我希望我要实现的目标是明确的。如果没有,我会尽力澄清。谢谢。 编辑说明: 我不是要增加计数器的名称,而是要增加计数器包含的

  • 问题内容: 这是我学习python的第二天(我了解C ++和一些OOP的基础知识),并且我对python中的变量有些困惑。 这是我目前对它们的了解: Python变量是对对象(可变或不可变)的引用(或指针?)。当我们有类似的内容时,不可变对象将在内存中的某个位置创建,而名称- 对象引用对将在某个命名空间中创建。当我们拥有时,不会复制任何内容,但是现在两个变量都引用相同的对象,并被添加到相同的名称空

  • 问题内容: 我想将一个类变量传递给另一个类,并使其成为该类的类变量。在以下情况下我该怎么做? 问题答案: 很难理解您正在问的问题,但这是一个可能的答案: 使B类成为A的子类: 如果重新声明为,则会出现一种情况,其中存在一个可以称为或的属性。(或在任一或刚刚…甚至作为或地方,并有类型和分别。) 如果您无法在和(或,以及一些包含声明的第三类)之间创建直接或子类型关系,那么您很不走运。他们无法共享声明。

  • 问题内容: 我刚开始使用快速语言,并且知道这个问题是重复的。我发现了几个类似的问题和答案,但我无法弄清这个问题。 我想将ScandString变量的值从ScanViewController传递给ResultViewController。 ScanViewcontroller如下: ResultViewController如下: println(detectedString)没有给我任何结果。问题是

  • 我有这样的代码。 @RequestMapping(Value=“/Persons”,Method=RequestMethod.Post)public@ResponseBody String addUser(@RequestParam String name){ 谢谢...