java - 实际值如何分配给由构造函数初始化的对象引用(实际内存,由新分配)?
问题描述
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,depth
在类中声明时为它们分配了内存box
,因此通过使用构造函数,它们获得了值10,12,16
,并且这些值由 object 获取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
。由于他们都指向同一个地方,他们都看到了变化。
推荐阅读
- sparql - DBpedia 图形提取
- sql-server - 未使用多列非聚集索引
- reactjs - React IE 8 与 axios 的兼容性问题
- c# - CRM Online RetrieveMultiple 与 OptionSetValueCollection 条件
- java - 在java中检查多个布尔条件
- maven - Spring应用程序立即关闭
- vue.js - vue-cli 3.x - 更改 src 和公共目录
- php - 亚马逊转录“找不到操作:StartTranscriptionJob”
- android - 服务被销毁时如何关闭服务中的后台线程
- material-ui - 如何制作 Material UI 布局