A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 浦原氏之喵 中级黑马   /  2015-2-8 17:42  /  1305 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如图,很多这样的图,有些连线两边地址相同,有些不同,开始以为连线就说明共享相同的地址值,但现在看来显然不是。请问地址问题怎么理解?

4 个回复

倒序浏览
方法区和堆区一初始化都有不同的地址值,有时候连线只是调用了这个区的值,不一定是把地址付给了它
回复 使用道具 举报
就是引用变量的值,弄清楚引用的到底是哪个就可以了
回复 使用道具 举报 1 0
对于你这个问题,是这么理解的:
在内存中,创建一个对象的时候,首先会在栈内存中创建一个引用变量,通过new关键之在堆内存中创建一个对象,然后把这个对象的引用(也就是你说的内存地址)赋给引用变量,举个栗子:String str1=new String(“abc”);String Str2 =new String(“abc”);String str3 =str1 ,在以上三个字符中,str1 !=str2,str3==str1.原理很简单,str1,str2创建的时候都是用new关键之来进行,所以不管值是不是一样,都会重新创建一个对象,所以str1和str2不是一个对象。在创建str3的时候,通过String str3来定义的时候,只是在栈内存中新建了一个str3的变量,但是没有通过new在对内存中创建对象,只是把str1所引用的那个对象的引用(也就是所谓的地址)复制给了str3,所以str1==str3;
另外一个点就是,如果定了String str4 =“abc”;str5 ="abc"。则str4==str5,他们引用的是同一个地址,也就是一个对象。但是,str4!=str3,其原因在于,使用字符串直接赋值给String对象的时候,这个字符串是可以在编译时确定下来的,编译器在创建变量的时候,会从常量池中查找是否存在这个字符串,如果存在,则直接引用,如果不存在,则在常量池中新建一个字符串,建立引用。常量池是为了更高效率的存取这些不可变对象,常量池中不存在两个相同的元素。
回复 使用道具 举报 1 0
图上很清楚:
对于s1,因为是new的对象,所以需要在堆内存中开辟空间,这处空间的地址是0x0011(假定)。而堆内存中的空间要存储字符串"abc",则会去常量池寻找,找到之后将常量池中"abc"的地址传递给堆内存中的空间。之后将这处空间的地址0x0011传递给s1---也就是引用。   换句话说堆内存中其实只是一个地址值,而非具体内容。
这样的话,两个字符串虽然内容一样,最终指向一样,但是它们在栈中的存储的地址值却不一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马