我对指针/参考的基础知识感到困惑

时间:2016-04-19 09:01:13

标签: java android

鉴于此:

int a = 10;
int b = a;
a++;

b = 10或11?如果是10,那为什么会发生这种情况(我以Android为例):

TextView x = new TextView();
TextView y = x;
x.setText("abcde");

导致y的文字也被设置为" abcde",不是吗?

编辑:

如果我使用'整数'而不是' int'?请问b = 11?

6 个答案:

答案 0 :(得分:2)

int是原语,因此ab不引用对象,它们只保存一个值。因此,作业int b = a;会将a的原始值复制到b,而a++只会修改a

使用引用类型时,行为会有所不同,如TextView代码段所示。 xy引用相同的TextView实例(对象),因此x.setText("abcde")修改两者引用的单个实例。

答案 1 :(得分:2)

你需要回归基础。

Java中的原语和对象的工作方式不同。

例如,对于下面的代码,ab是不同的变量并具有各自的值。

int a = 10;
int b = a;
a++;

因此,当您执行a++时,它只影响a而不是b的值,因为它们是基元,并且它们具有单独的单个值。

但是对于这段代码

TextView x = new TextView();
TextView y = x;
x.setText("abcde");

xy都是不同的变量,但它们都指的是内存中的同一个对象

因此,当您使用一个引用来更改值时,它将在内存中的实际对象上进行更改,因此您在访问它时会获得新值,尽管这次使用的是另一个引用内存中相同对象的变量

答案 2 :(得分:0)

好吧,a++a = a + 1的简称形式,因此您为a分配了一个新值,这是将1添加到a的结果。但是在第二个示例中,您调用xy引用的对象上的方法,因此您可以修改该对象。

答案 3 :(得分:0)

在第二种情况下,为该对象创建了Memory。对象y指向对象x。所以对象x和对象y正在访问相同的内存。每当我们更改对象x的任何属性时,它都会存储在该内存位置。由于对象y也指向相同的内存位置,因此值也会反映到对象y的属性中。

在第一种情况下,我们只是为变量赋值,我们没有为该变量分配单独的内存块。

答案 4 :(得分:0)

  

如果我使用'Integer'而不是'int'怎么办?请问b = 11?

答案:Integer是一个包装类,当我们想使用Objects而不是原始数据类型时,我们使用包装类。两种情况下“b”都相同。 包装类提供了将原始类型转换为对象和对象为基本类型(装箱和取消装箱)的机制

其他人很好地解释了其他部分,所以我没有为它添加任何东西。

答案 5 :(得分:0)

使用Integer问题,Java中的Integer是不可变的。你必须使一个新的Integer增加。因此,它不会起作用。

另一部分已经回答了。