一个类的属性是引用类型,那创建对象时候堆里保存的是地址还是值呢?

问题描述

publicclassUser{publicStringname="你好";publicStringdihzi="你好";}===========================================//测试类Useru=newUser();System.out.println(u.name==u.dihzi);System.out.println(u.name.equals(u.dihzi));==========================================输出结果truetrue============================================我的问题是,单独看String类,栈和堆我都知道怎么回事,这个就不说了!现在是在User类里的属性又是一个引用类型(String类)的时候,当你newUser()的时候,按理说应该是u在栈里,然后newUser()在堆里开辟一个内存空间,然后存值。但现在属性发现是String类,又是一个引用类型了,那这种情况下,怎么办呢?但可以肯定的是,String类自己肯定是引用变量在栈,对象在堆,这个是一定的,我现在的疑问就是:1把String类的对象在堆里的值,复制一份给User类在堆里的对象吗?2还是说把String类的在栈的地址,复制给User类在堆里的对象?3还是说User类在栈内存里保存的是String类在栈的地址,而不是堆里u对象的地址?也就是说当u.name的时候,我是直接去调用String类。通过上面的结果,我猜3的可能性比较大,因为如果是1,2的话,你可以发现当你newUser()的时候,会分别在堆内存开辟2块地址,一个地址是给name一个地址是给dizhi,这也表明这俩地址显然是不同的!但是我上面u.name==u.dihzi结果确实true这说明比较的肯本不是User类的对象地址,而是String类的对象地址。如果是2的话,虽然对象里有String类的地址,可以去找到String类,但是很麻烦,从User栈里找到堆地址,在根据堆里面的地址找到String栈的地址。。。。那还不如直接在User类的栈地址里直接存一个String类的栈地址,省了很多环节。所以我猜测3的可能性比较大。不知道理解的对不对,求懂的指教下!补充下:我的重点不是问String类的堆栈情况,而是在创建User类对象的时候,开辟的堆空间里保存的究竟是什么呢?因为我知道String类也是一个类,他的引用变量在栈,对象在堆,堆里保存的值,现在User也是一个类,他属性又是一个引用类型,那User的对象在堆里怎么保存这个引用类型?或者说在堆里怎么处理这个引用类型的属性?是保存的String类型里的值?还是保存一个String类型的地址让User对象去调用?

解决方案

解决方案二:
User对象保存在堆中。变量保存内存地址。
解决方案三:
堆里保存的是值(对象)地址(也就是引用)保存在栈中

时间: 2024-08-01 13:07:22

一个类的属性是引用类型,那创建对象时候堆里保存的是地址还是值呢?的相关文章

java as给一个类添加属性,并对这个属性赋值,查询操作

问题描述 java as给一个类添加属性,并对这个属性赋值,查询操作 java as给一个类添加属性,并对这个属性赋值,查询操作 ,求大神..................................... 解决方案 你这是 sql 还是 java--看不明白. 解决方案二: 完全看不懂想表达什么啊...... 解决方案三: 如果是查询就select 字段名 as 别名 from 表名. 如果是更新就update 表名 set 字段名='值'. 解决方案四: 如果是查询就select 字段

如何在程序运行时动态修改一个类的属性的get;set;?

问题描述 publicclassMyTestClass{privatestring_name;publicstringName{get{returnstring.Format("名字:{0}",_name);}set{value=value??string.Empty;_name=value.Substring(0,4);}}}publicstaticvoidMain(){DynamicMethodmethod=newDynamicMethod("Set_Name"

PHP取得一个类的属性和方法的实现代码_php技巧

复制代码 代码如下: <?php class myclass { var $var1; var $var2 = 'xyz'; var $var3 = 100; private $var4; function myclass() { $this->val1 = "foo"; $this->val2 = "bar"; return true; } function test1() { return true; } } //get_class_metho

vb.net中给一个类添加方法

类的方法就是在类中用户声明的那些公有的(public)Sub或者Function过程. 例如:下面代码就是在一个Account中加入一个Withdrawal方法,用户可以把这个公有的函数过程加入到类模块中去: Public Function WithDrawal(Byval Amount As Currency,_ Byval TransactionCode As Byte) As Double '(Code to perform the withdrawal and return the 'n

vb.net 类的属性的设置和获取问题

怎么样定义一个自定义类的属性呢?怎么样来设置和获取它的属性呢?下面是一个类的例子: Public Class TestClass Test          Private _classid As String    ''' <summary>    ''' 设置和获取分类ID    ''' </summary>    Public Property classid()Property classid() As Integer        Get            Retur

java private-java 一个类的对象访问私有属性的问题

问题描述 java 一个类的对象访问私有属性的问题 public class ModifierTest1 { public static void main( String[] args ) { A a = new A(); //System.out.println(a.s); a.f(); } } class A { private int i; private String s; public A() { i = 123; s = "hello"; } public void f(

类A里写了一个类B,如何从类B的某个属性直接获得类A?

问题描述 类A里写了一个类B,如何从类B的某个属性直接获得类A?我的目的:因为list<类A>,所以当某个类B里的某个属性值符合了用户要求,就能够直接找到类B所在的类A,以及获得类A的全部属性.所以,是不是需要在类B中写一个属性对应类A的什么?到这里就不会写了,请各位指教. 解决方案 解决方案二:我大概看明白你的意思了..1.)我估计你A类和B类不是内嵌的关系(B不是嵌套在A类里),而是A里面有一个变量,类型为B.2.)你的问题完全可以用LINQ来解决..比如有个list<类A>名

mvc中动态给一个Model类的属性设置验证

原文:mvc中动态给一个Model类的属性设置验证 在mvc中有自带的验证机制,比如如果某个字段的类型是数字或者日期,那么用户在输入汉字或者英文字符时,那么编译器会自动验证并提示用户格式不正确,不过这样的验证毕竟功能有限,那么就需要我们自己进行定制验证. 假设有Model类:class Dinners{ private string Title;      private System.DateTime EventDate;      private string Description;   

android中的service本质是一个类还是一个方法还是一个对象

问题描述 android中的service本质是一个类还是一个方法还是一个对象 android中的service本质是一个类还是一个方法还是一个对象 当然我明白java中一切都是对象的这种说法 解决方案 service在哪里看到的,作为类的定义它是类,对它实例化创建了对象并且执行就是对象了. 解决方案二: java中一切都是对象 这个说法其实不准确.你能说java中的关键字是对象么? 解决方案三: Service(服务)是Android 核心组件之一,特点就是Android系统帮你实例化他的对象