Discuss / Java / 基本数据类型变量的地址问题

基本数据类型变量的地址问题

廖老师您好,在“Java程序基础”的“变量和数据类型”一节中,对于下面的代码:

int n = 200;
int x = n;

您提到JVM会为x新分配一个地址,但是我在网上查阅资料时,有人说x和n是同一个地址。我现在不知道以哪个为准了,请问廖老师有什么权威的书籍中对此有解释的?

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你自己验证:

int n = 200;
int x = n;
System.out.println(x);
n++;
System.out.println(x);

如果x和n是一个地址,那我改了n是不是x也改了?

如果x和n不是一个地址,那我改了n跟x就没有关系了

廖雪峰

#3 Created at ... [Delete] [Delete and Lock User]

再进一步,如果是个数组,x和n是不是同一地址呢?

int[] n = { 200 };
int[] x = n;
System.out.println(x[0]);
n[0]++;
System.out.println(x[0]);

廖老师您好。

先回答第二个问题,由于数组是引用类型,x和n指向同一个对象,因此n[0]++后,x[0]也变成了201。

关于您提的第一个问题,我是这么理解的:n++相当于n=n+1,n++后新开辟了一块内存地址存放201,n指向201,而x还是指向200,因此x的值没变。

我的困惑主要在于,引用类型的变量相当于指针,指向对象的地址,那么基本类型的变量相当于什么呢?如果也相当于指针,指向值的地址,那么x和n就是同一个地址;如果它不相当于指针,那么它是什么呢?

廖雪峰

#5 Created at ... [Delete] [Delete and Lock User]

Java和C是一样的,基本类型追求效率,不会新开地址,n++就是修改自身

void main()
{
    int n = 200; // 栈分配一个int空间给n
    int x = n; // 栈再分配一个int空间给x,同时复制n的值给x
    n++;
    printf("%d\n", n);
    printf("%d\n", x);
}

Java没有暴露指针,所以写不出C这样的代码:

int n = 200;
int *x = &n; // 栈分配一个指针空间给x,同时复制n的地址给x
n++;
printf("%d", *x);

引用类型赋值是复制地址(准确说是对象id,id关联的才是地址,因为JVM要移动内存里的对象,id不变,地址会变)

基本类型赋值是复制对应的值

对基本类型复制地址在Java中做不到,因为没有int*类型

受教了,多谢廖老师解惑。


  • 1

Reply