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

时间:2018-07-24 17:48:04

标签: java core

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类中声明了三个双精度类型变量,并使用构造函数初始化了这些变量,我设置了使用构造函数的对象的状态。我的问题是height,width,depthbox类中声明时为它们分配了内存,因此通过使用构造函数,它们获得了值10,12,16,而这些值由对象mybox1占用。因此mybox1的存储位置是否具有这些值?或者这些变量的存储位置是否具有这些值,并且对它们的引用存储到objets引用的位置?对象内部状态获取值时内存如何工作?

1 个答案:

答案 0 :(得分:2)

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

尝试以下代码:

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指向的数据。由于他们都指向同一个地方,因此他们都看到了变化。