实际值是如何分配给构造函数初始化的对象引用(实际内存,由new分配)的


class box
{
double height,width,depth;
box(double h,double w,double d)
{
height=h;
width=w;
depth=d;
}
}
class boxdemo7
{
public static void main(String args[])
{
double vol1,vol2;
box mybox1=new box(10,12,16);
} 
}

box类的这些程序中,我声明了三个双类型变量,并用构造函数初始化这些变量,这意味着我设置了使用构造函数的对象的状态。我的问题是,当在box类中声明时,height,width,depth为它们分配了内存,所以通过使用构造函数,它们得到了值10,12,16,这些值由对象mybox1获取。那么mybox1的内存位置有这些值吗?或者这些变量内存中有这些值,并且对这些值的引用存储到对象引用的位置?当对象内部状态获取值时,内存是如何工作的?

与对象不同,基元类型是通过值传递的。因此,在这种特殊情况下,值10、12和16将被指定给长方体对象内的字段。另一方面,对于对象,它将取决于构造函数的实现。如果使用简单的赋值运算符,则字段将获得对传递对象的引用,对传递对象所做的更改将更改字段所引用的对象。如果基于传递对象创建新对象,则它们将保持独立。

试试这个代码:

public class Test {
static class sample{
int primitive;
int[] object;
sample(int prim, int[] obj){
primitive = prim;
object = obj;
}
}
public static void main(String... args){
int primram = 0;
int[] objectParameter = new int[1];
sample demonstration = new sample(primram, 
objectParameter);
System.out.printf("Old Values: %d, %d%n", 
demonstration.primitive, 
demonstration.object[0]);
primram++;
objectParameter[0] = primram;
System.out.printf("New Values: %d, %d%n", 
demonstration.primitive, 
demonstration.object[0]);
objectParameter = new int[1];
System.out.printf("Unchanged Values: %d, %d%n", 
demonstration.primitive, 
demonstration.object[0]);
}
}

你应该得到输出:

Old Values: 0, 0
New Values: 0, 1
Unchanged Values: 0, 1

请注意,当我们增加primitiveParameter值时,第一个值,即基元并没有改变,因为它已经被值传递,并且不再与对象内的基元字段有任何关系。

设置objectParameter[0]确实更改了示例对象内部的值,因为数组是对象。当你在构造函数中说object = obj时,你会把object指向obj所指向的数据。由于它们都指向同一个地方,所以它们都会看到变化。

最新更新