我知道“可变”和“不可变”是应该用来描述对象改变诸如Java和Objective
C之类的面向对象语言中的值的能力的术语。但是,我想提出它,因为它与我的语言有关有关原始数据的问题。我知道,当我更改持有不可变对象的变量的值时,实际上是在创建一个新对象。但是,我想知道C中的基本数据的行为是否类似于不可变对象。我的意思是,当我更改保存原始数据的变量的值时,将创建新数据并由该变量引用。还是现有的原语实际上改变/修改了存储的数据值?
编辑#1:
问题#1: 我想消除一些误解(无论是我本人还是其他人),因为当我说“当我更改持有不可变对象的变量的值时,我实际上是在创建一个新对象。”
当我这么说时,我并不是要将变量分配给现有对象。例如:
// Example 1: I did not mean this
-------------------------
String x = "Hello World";
String y = x;
-------------------------
// Example 2: What I meant is this
-------------------------
String x = "Hello World";
//This will print out "Hello World"
System.out.println(x);
x = "Goodbye World";
//This will print out "Goodbye World"
System.out.println(x);
-------------------------
当然,就像示例1中那样,将变量y分配给变量x,这就是你们提出的情况,只将变量y引用给x所引用的对象。当然,在这种情况下,没有新对象。只是同一对象“
Hello World”被两个变量引用。
我的意思是,在示例2中,当x =“ Goodbye World”时,变量x引用一个具有值“ Goodbye
World”的新String对象,而不是用x初始化的第一个String对象“ Hello
World”。字符串是Java中的不可变对象。更改String变量的值的唯一方法是让变量引用现有对象 或 新的String对象。如果没有现有对象(“
Goodbye World” String对象尚未在任何地方创建),则以上代码仅创建了一个新的String对象,并对其引用了x。我对吗?如果没有,请纠正我。
问题2: 我想总结一下答案,尤其是来自 Ulfalizer 的答案:
1)实际上,变量可以存在2种形式:
a)“内存地址”-对于C语言变量以及Java和Objective C有关原始类型数据的情况就是如此。例如:int x
=1。这里的变量x是一个实际的内存地址本身,它的类型为integer,并用值1初始化。
b)“参考”-对于非原始类型数据(对象),Java中的大多数变量都是这种情况。例如:String x =“ Hello
World”。变量x只是指向“存在于某处的内存地址”的指针/引用,其内容为“ Hello World”值。
2)C,Java和目标C中的原始类型数据的变量充当“内存地址”。因此,当我这样做时:
-------------------------
int x = 10;
x = 2;
-------------------------
x变量的值(又名-内存地址)实际上从10更改为2。换句话说,可以修改/更改存储在“ Memory Address”变量中的值。
3)在C语言中,如果变量以’‘-指针类型声明,则它也可以充当引用。我将使用Ulfalizer* 的示例:int *
ptr。ptr是一个指针变量,可以指向另一个变量(即内存地址),例如:ptr =&x。如果x初始化为:int x =
10,则x是保存值为10的实际内存地址。因此在下面的代码中
-------------------------
int x;
int *ptr;
ptr = &x;
*ptr = 1;
-------------------------
我实际上可以通过ptr指针变量修改存储在x变量(又名-内存地址)中的值。
请确认我的解释是否正确/错误。谢谢。